from __future__ import annotations

from dataclasses import dataclass
from typing import Literal


AssistantProfileKey = Literal["home", "documents", "menu", "whatsapp", "admin"]


@dataclass(frozen=True)
class AssistantProfileDefinition:
    key: AssistantProfileKey
    label: str
    summary: str
    base_prompt: str
    allowed_tools: tuple[str, ...] = ()


_HOME_ALLOWED_TOOLS = (
    "get_locale_profile",
    "search_products",
    "upsert_product",
    "get_purchase_overview",
    "compare_purchase_periods",
    "get_purchase_frequency",
    "get_purchase_batches",
    "get_purchase_history",
    "get_suspended_order",
    "write_suspended_order",
    "get_sales_goals",
    "write_sales_goal",
    "list_shared_notes",
    "write_shared_note",
    "get_reservations_snapshot",
    "create_reservation",
    "update_reservation",
    "delete_reservation",
    "create_google_workspace_document",
    "get_module_settings",
    "update_module_settings",
    "list_reservations",
    "list_fiscal_documents",
    "list_tenant_users",
    "get_timeclock_summary",
    "manage_tenant_user",
    "update_venue_profile",
    "describe_tenant_schema",
    "run_tenant_query",
)

_DOCUMENTS_ALLOWED_TOOLS = (
    "get_locale_profile",
    "search_products",
    "get_purchase_overview",
    "compare_purchase_periods",
    "get_purchase_frequency",
    "get_purchase_batches",
    "get_purchase_history",
    "get_sales_goals",
    "list_shared_notes",
    "get_reservations_snapshot",
    "create_google_workspace_document",
    "describe_tenant_schema",
    "run_tenant_query",
)

_PROFILES: dict[AssistantProfileKey, AssistantProfileDefinition] = {
    "home": AssistantProfileDefinition(
        key="home",
        label="Assistente Home",
        summary="Workspace conversazionale del gestore con accesso ai dati operativi reali del locale.",
        base_prompt=(
            "Sei l'assistente operativo interno del locale. Rispondi sempre in italiano, con tono sobrio, pratico e "
            "orientato all'azione. Tratta le informazioni del locale come confidenziali, usa i tool reali quando sono "
            "disponibili e non inventare mai dati, disponibilita o azioni non eseguite."
        ),
        allowed_tools=_HOME_ALLOWED_TOOLS,
    ),
    "documents": AssistantProfileDefinition(
        key="documents",
        label="Assistente Documenti",
        summary="Motore documentale che crea anteprime e file partendo da dati reali del locale.",
        base_prompt=(
            "Sei l'orchestratore documentale del locale. Devi preparare Google Doc o Google Sheet solo con dati reali "
            "quando la richiesta riguarda ordini, prodotti, fornitori, prenotazioni, note o obiettivi. Se mancano dati "
            "affidabili, dichiaralo chiaramente e non riempire il documento con contenuti inventati."
        ),
        allowed_tools=_DOCUMENTS_ALLOWED_TOOLS,
    ),
    "menu": AssistantProfileDefinition(
        key="menu",
        label="Assistente Menu",
        summary="Concierge digitale del menu con tono curato e vincolo assoluto ai contenuti del locale.",
        base_prompt=(
            "Sei il concierge digitale del menu del locale. Rispondi sempre in italiano, con tono curato, chiaro e "
            "orientato alla vendita assistita. Usa solo i dati realmente configurati dal locale. Non inventare piatti, "
            "drink, prezzi, ingredienti, disponibilita, promozioni o allergeni. Se un'informazione manca, dichiaralo "
            "in modo semplice e rimanda al personale del locale. Quando consigli cosa scegliere, proponi al massimo tre "
            "opzioni motivate."
        ),
    ),
    "whatsapp": AssistantProfileDefinition(
        key="whatsapp",
        label="Assistente WhatsApp Prenotazioni",
        summary="Assistente cliente-oriented dedicato solo a disponibilita e prenotazioni del locale.",
        base_prompt=(
            "Sei l'assistente WhatsApp prenotazioni del locale. Rispondi sempre in italiano con un tono cordiale, umano, "
            "accogliente e professionale, come farebbe il personale del locale con un cliente. Sii gentile, chiaro e "
            "sintetico, ed evita formule brusche o fredde. Resta solo nel perimetro di prenotazioni, disponibilita, "
            "conferme, modifiche, cancellazioni, orari e informazioni strettamente utili a prenotare. Se il cliente "
            "chiede menu, cocktail, eventi o altro fuori ambito, spiega con cortesia che questo canale gestisce solo le "
            "prenotazioni e invita a contattare direttamente il locale. Non condividere mai dati, nomi, numeri di "
            "telefono o dettagli relativi alle prenotazioni di altri clienti: se qualcuno li chiede, scusati con "
            "cortesia, spiega che per privacy non puoi fornire queste informazioni e riporta la conversazione "
            "sull'eventuale disponibilita per la sua richiesta. Non inventare disponibilita, conferme o policy non "
            "presenti nella conversazione. Restituisci sempre e soltanto il testo finale del messaggio da inviare al "
            "cliente, senza JSON, senza markdown, senza tag tecnici, senza ruoli e senza metadati. Quando interpreti "
            "riferimenti temporali relativi, usa sempre il contesto temporale corrente fornito dal sistema."
        ),
    ),
    "admin": AssistantProfileDefinition(
        key="admin",
        label="Assistente Admin",
        summary="Assistente piattaforma per il super admin, focalizzato su tenant, account e operativita della suite.",
        base_prompt=(
            "Sei l'assistente piattaforma del super admin. Rispondi in italiano con tono professionale e sintetico. "
            "Distingui sempre tra dati di piattaforma e dati di un singolo locale, non confondere tenant diversi e non "
            "inventare mai stato dei moduli, sessioni o configurazioni."
        ),
    ),
}


def get_assistant_profile(key: AssistantProfileKey) -> AssistantProfileDefinition:
    return _PROFILES[key]


def list_allowed_tools_for_profile(key: AssistantProfileKey) -> tuple[str, ...]:
    return get_assistant_profile(key).allowed_tools


def list_assistant_profiles() -> tuple[AssistantProfileDefinition, ...]:
    return tuple(_PROFILES.values())


def compose_assistant_prompt(
    key: AssistantProfileKey,
    *,
    venue_name: str | None = None,
    locale_instructions: str = "",
    extra_sections: tuple[tuple[str, str], ...] = (),
    override_base_prompt: str | None = None,
) -> str:
    profile = get_assistant_profile(key)
    sections: list[str] = [(override_base_prompt or profile.base_prompt).strip()]

    cleaned_venue_name = (venue_name or "").strip()
    if cleaned_venue_name:
        sections.extend(["", f"Locale: {cleaned_venue_name}"])

    cleaned_locale_instructions = locale_instructions.strip()
    if cleaned_locale_instructions:
        sections.extend(["", "Istruzioni aggiuntive del locale:", cleaned_locale_instructions])

    for heading, content in extra_sections:
        cleaned_heading = heading.strip()
        cleaned_content = content.strip()
        if cleaned_heading and cleaned_content:
            sections.extend(["", f"{cleaned_heading}:", cleaned_content])

    return "\n".join(sections)
