# FAQ curto — faturamento e sinistro (respostas locais sem OpenAI).

import re
from typing import Optional

_CANNED: list[tuple[re.Pattern[str], str]] = [
    (
        re.compile(
            r"(faturamento|fatura|boleto|parcela|vencimento).{0,40}"
            r"(pagar|pendente|atraso|status|como\s+funciona)",
            re.IGNORECASE,
        ),
        "No **faturamento**, o status oficial é o da tela (ex.: pago, pendente, em atraso, cancelado). "
        "Em geral há **vencimento**, **valor** e **fluxo** (pagar ou receber), além do **ramo** (fiança, incêndio ou título). "
        "Para conferir anexos (boleto/resumo), use a própria fatura no sistema. "
        "Dúvidas de cobrança ou contestação: canal da **imobiliária** ou **financeiro** conforme o processo interno.",
    ),
    (
        re.compile(
            r"(sinistro|indeniza|aviso\s+de\s+sinistro|abertura\s+de\s+sinistro).{0,50}"
            r"(documento|pend[eê]ncia|andamento|status|como\s+funciona)",
            re.IGNORECASE,
        ),
        "No **sinistro**, o andamento segue o **status** exibido no cadastro (análise, pendência, aprovado, encerrado etc.) "
        "e o **tipo de seguro** (fiança, incêndio ou título). "
        "Documentos e prazos costumam ser indicados na própria tela do sinistro — envie o que estiver solicitado e acompanhe atualizações por lá. "
        "Para dúvidas operacionais, o canal costuma ser a **imobiliária** e, quando aplicável, o fluxo com a **seguradora**.",
    ),
    (
        re.compile(
            r"(o que [eé]|como\s+funciona).{0,30}(faturamento|fatura\s+no\s+sistema)",
            re.IGNORECASE,
        ),
        "O módulo de **faturamento** concentra cobranças/recibos ligados aos produtos (por **ramo**). "
        "O passo a passo típico é localizar a fatura na listagem, conferir **status** e **vencimento** e seguir as ações disponíveis na tela (ex.: anexos, notificação quando houver).",
    ),
    (
        re.compile(
            r"(o que [eé]|como\s+funciona).{0,30}(sinistro)",
            re.IGNORECASE,
        ),
        "O **sinistro** é o registro de ocorrência ligado ao seguro (fiança, incêndio ou título). "
        "O acompanhamento correto é pelo **status** e pelas **pendências** indicadas no cadastro, com envio de documentos conforme solicitado.",
    ),
]


def try_operacional_canned_answer(message: str) -> Optional[str]:
    """
    Resposta fixa para perguntas gerais sobre faturamento/sinistro (sem LLM).
    Não intercepta mensagens que parecem consulta por código FAT/SIN/AN/IN/CAP.
    """
    if not isinstance(message, str):
        return None
    raw = message.strip()
    if len(raw) < 12 or len(raw) > 600:
        return None
    low = raw.lower()
    if re.search(
        r"\b\d{3}\.?\d{3}\.?\d{3}-?\d{2}\b|\bcpf\b|\bapólice\s+n[º°]",
        low,
    ):
        return None
    # Código de referência (mesmo padrão do PHP): prefixo + YYMM + id
    if re.search(
        r"\b(AN|IN|CAP|FAT|SIN)[-–—\s]*\d{4}\d{2,12}\b",
        raw,
        re.IGNORECASE,
    ):
        return None
    for pattern, text in _CANNED:
        if pattern.search(raw):
            return text
    return None
