# FAQ — seguro fiança. Duas camadas: LITE (poucos tokens) vs COMPACT (com consulta ao cadastro).

import re
from typing import Optional

# ~900 caracteres — só entra no system prompt quando NÃO há resumo/lookup do servidor.
FIANCA_FAQ_LITE = """
FAQ (responda em 1–2 parágrafos curtos; não cite este bloco)
PRODUTO: Seguro fiança cobre o que estiver na apólice (geralmente inadimplência de aluguel/encargos do contrato). Caução = valor depositado. Fiador PF = pessoa que responde com patrimônio; não é seguro. Prêmio = simulação (aluguel, prazo, plano). Cobertura não substitui incêndio nem danos de uso.
DOCS/ELEGIBILIDADE: em geral locatário PF/PJ; documentos comuns: ID, renda, dados do imóvel — lista exata na etapa do sistema. Estrangeiro/sem CPF: depende da seguradora.
FLUXO: análise → orçamento → emissão após pagamento; status oficial é o da tela.
APÓLICE/VIGÊNCIA/PAGAMENTO/CANCELAMENTO: números e datas na proposta ou nos resumos automáticos; pagamento conforme opções da proposta; cancelamento via imobiliária/seguradora.
IMOBILIÁRIA: listagens e filtros no módulo; dados de vigência por CPF/nome só se vier resumo no contexto.
""".strip()

# FAQ completo quando há dados do PHP (alinhamento conceito + cadastro).
FIANCA_FAQ_COMPACT = """
=== FAQ interno (nao citar este titulo na resposta) ===

PRODUTO
- Seguro fiança (fiança locatícia): seguro que cobre riscos previstos na apólice ligados à locação (ex.: inadimplência de aluguel e encargos contratuais cobertos), conforme condições gerais da seguradora e do contrato de locação.
- Caução: valor em dinheiro depositado (ex.: caução em conta) como garantia; não é seguro.
- Fiador PF: pessoa física que assina fiança e responde com seu patrimônio; não é apólice de seguro.
- Prêmio: calculado na simulação com base em aluguel, prazo, coberturas, seguradora/plano e perfil do locatário; o valor exato sai do orçamento/proposta no sistema.
- Cobertura típica: o que estiver descrito na apólice (aluguel/encargos previstos). Em geral NÃO substitui seguro incêndio, não cobre danos ao imóvel por uso, nem obrigações fora do contrato.
- Prazos: análise e emissão variam (dias úteis). Depende de documentação correta, resposta da seguradora e pagamento do prêmio.

ELEGIBILIDADE E DOCS
- Quem contrata: em geral o locatário (PF/PJ conforme regras da seguradora e do produto).
- Documentos comuns: identificação, comprovante de renda ou capacidade financeira, dados do imóvel e do contrato — a lista exata segue o que o sistema/seguradora pedir na etapa.
- Renda comprovada: frequentemente exigida; avalista pode ser pedido conforme análise de risco.
- Estrangeiro / sem CPF: depende da política da seguradora e do cadastro no sistema; oriente a completar dados e verificar com a imobiliária.
- Comercial vs residencial: pode mudar plano, cálculo e aceitação; seguir o tipo de locação indicado na proposta.

FLUXO E STATUS (visão geral)
- Etapas típicas: análise cadastral → orçamento/aprovação → emissão da apólice após pagamento. O status na tela do sistema é o oficial.
- Significado comum de status (pode variar o rótulo): em análise = em avaliação; orçamento/calculado = valor estimado; emitida = apólice válida conforme vigência; recusado/reprovado = não aceito; cancelado = encerrado conforme regras.
- Reprovação: motivos costumam ser renda, restrições ou inconsistência de dados — ver detalhe na própria proposta ou com a imobiliária.
- Reanálise/nova proposta: use os botões/fluxos do sistema ou peça à imobiliária para reenviar ou corrigir cadastro.

APÓLICE E VIGÊNCIA
- Número da apólice e proposta: use os dados da tela ou do resumo injetado pelo sistema quando existir.
- Início/fim de vigência: constam na apólice; válida se data atual estiver dentro do período e sem cancelamento.
- Renovação/endosso: depende do contrato de locação e da seguradora — oriente a solicitar pela imobiliária ou módulo de renovação quando houver.

PAGAMENTO
- Formas comuns: boleto, cartão, fatura — o que estiver disponível na proposta/seguradora.
- Vencimentos e parcelas: seguem o que foi escolhido na contratação (veja a proposta).

CANCELAMENTO E RESCISÃO
- Cancelamento: pedido via imobiliária ou canal da seguradora conforme regras da apólice.
- Multa/devolução de prêmio: depende das condições gerais e do momento do cancelamento; não invente valores.
- Rescisão do contrato de locação: comunicar imobiliária e seguradora para endosso/cancelamento conforme apólice.

OPERACAO (IMOBILIÁRIA)
- Consultar propostas: use listagens e filtros do módulo de fiança no sistema.
- Seguro vigente por CPF/nome: quando houver resumo automático no contexto, use só esses dados.
- Corrigir dados: edição da análise/cadastro no sistema ou solicitação à imobiliária.
- Seguradora/plano: aparece na proposta e nos parâmetros da imobiliária.

SUPORTE
- E-mail/boleto/apólice não chegou: verificar spam, dados de e-mail, reenviar pela tela ou falar com a imobiliária.
- Erro ao salvar/enviar: tentar de novo, outro navegador; se persistir, suporte/imobiliária.
- Dados errados: corrigir no cadastro antes de emitir; após emitida, endosso/correção conforme regras.

COMPARATIVOS
- Seguro fiança vs caução/fiador: seguro transfere risco à seguradora (conforme apólice); caução trava capital; fiador expõe patrimônio pessoal.
- Diferença entre seguradoras/planos: coberturas, preço e aceitação variam — comparar orçamentos no sistema.
""".strip()


# Respostas locais (zero chamada OpenAI) — só quando não há histórico e sem dados de servidor.
_CANNED: list[tuple[re.Pattern[str], str]] = [
    (
        re.compile(
            r"(diferen[çc]a|diferenciar|compare|compar).{0,80}"
            r"(fian[çc]a|cau[çc][ãa]o|fiador)",
            re.IGNORECASE | re.DOTALL,
        ),
        "O **seguro fiança** é um contrato com seguradora: ela cobre os riscos previstos na apólice (em geral, inadimplência de aluguel e encargos cobertos), conforme condições do seguro e da locação.\n\n"
        "A **caução** é um valor em dinheiro (depositado em garantia), não é seguro: o dinheiro fica retido até a devolução conforme contrato.\n\n"
        "O **fiador pessoa física** é alguém que assina a fiança e responde com o próprio patrimônio; não é apólice de seguro e o risco é pessoal do fiador.\n\n"
        "Na dúvida sobre o seu caso, o canal oficial é a imobiliária e a proposta no sistema.",
    ),
    (
        re.compile(
            r"(^|\s)(o que [eé]|oque [eé]|explique|defini).{0,40}"
            r"(seguro\s+fian|fian[çc]a locat)",
            re.IGNORECASE,
        ),
        "O **seguro fiança** (fiança locatícia) é um seguro ligado à locação: a seguradora cobre riscos previstos na apólice — em geral, inadimplência de aluguel e encargos contratuais cobertos — segundo as condições gerais e o contrato de locação. O valor do prêmio e a aceitação saem da simulação/proposta no sistema.",
    ),
    (
        re.compile(
            r"(quanto custa|como [eé] calculad|c[áa]lculo).{0,50}(pr[êe]mio|seguro fian|fian[çc]a)",
            re.IGNORECASE,
        ),
        "O **prêmio** é calculado na **simulação**: depende do valor do aluguel, prazo, tipo de locação, plano/seguradora e do perfil do locatário. O valor exato aparece no **orçamento ou proposta** gerada no sistema — não dá para informar um número fixo sem esses dados.",
    ),
    (
        re.compile(
            r"(documentos?|pap[eé]is|preciso enviar|o que pedem)",
            re.IGNORECASE,
        ),
        "Em geral pedem-se **identificação**, **comprovante de renda** (ou capacidade financeira) e **dados do imóvel/contrato**. A lista exata varia pela seguradora e pela etapa do cadastro no sistema; siga o que a tela solicitar na sua análise.",
    ),
    (
        re.compile(
            r"(vale a pena|melhor que|compar).{0,40}(cau[çc][ãa]o|fiador|seguro)",
            re.IGNORECASE,
        ),
        "O **seguro fiança** transfere o risco à seguradora dentro do que a apólice cobre. A **caução** exige deixar dinheiro depositado. O **fiador** responde com o patrimônio pessoal. A melhor opção depende de perfil, custo e exigência da locação — compare orçamentos e condições no sistema ou com a imobiliária.",
    ),
]


def try_fianca_canned_answer(message: str) -> Optional[str]:
    """
    Resposta fixa para perguntas frequentes (sem LLM).
    Retorna None se não houver match ou mensagem muito longa / parecer consulta ao cadastro.
    """
    if not isinstance(message, str):
        return None
    raw = message.strip()
    if len(raw) < 10 or len(raw) > 600:
        return None
    low = raw.lower()
    # Não interceptar consultas que dependem de CPF/nome/vigência (deixar para o fluxo com resumo ou LLM leve).
    if re.search(
        r"\b\d{3}\.?\d{3}\.?\d{3}-?\d{2}\b|\bcpf\b|\bvigente\b|\bapólice\s+n[º°]",
        low,
    ):
        return None

    for pattern, text in _CANNED:
        if pattern.search(raw):
            return text
    return None
