# Guia curto de uso de modulos (respostas locais sem OpenAI).
# Alinhado a docs/GUIA_USO_MODULOS_E_SINISTRO.md no aluguesemfiador.

import re
from typing import Optional

_CANNED: list[tuple[re.Pattern[str], str]] = [
    (
        re.compile(
            r"(como|onde).{0,50}"
            r"(abrir|abre|cadastrar|registrar|criar|incluir|lan[çc]ar).{0,40}"
            r"(sinistro|aviso\s+de\s+sinistro)",
            re.IGNORECASE | re.DOTALL,
        ),
        "Para **abrir um sinistro** no sistema SOU:\n\n"
        "1) Acesse a **listagem de sinistros** (caminho típico: `/listar-sinistro` no seu site).\n"
        "2) Use a opção de **novo sinistro** (caminho típico: `/add-sinistro`). "
        "Se o sistema pedir, escolha o **tipo de seguro** (fiança, incêndio ou título) e o **contrato/apólice** vinculado.\n"
        "3) Preencha os **dados da ocorrência** e os **documentos** solicitados nas etapas da tela; salve rascunho se houver e **finalize** o cadastro.\n"
        "4) Acompanhe o **status** na listagem ou em **editar sinistro** (`/editar-sinistro/` + número do registro).\n\n"
        "O menu pode variar por perfil; se não achar, use os caminhos acima após o domínio do sistema. "
        "Sem **permissão de sinistro**, o módulo não aparece. Dúvidas de documentação exigida pela **seguradora** "
        "acompanhe pelo status do sinistro ou fale com a **imobiliária**.",
    ),
    (
        re.compile(
            r"(como\s+usar|onde\s+fica|passo).{0,40}(faturamento|faturas?|boletos?\s+de\s+fatura)",
            re.IGNORECASE,
        ),
        "No **faturamento** você controla cobranças/recibos por produto (ramo: fiança, incêndio ou título).\n\n"
        "- **Listagem**: caminho típico `/listar-faturamentos`.\n"
        "- **Nova fatura**: `/novo-faturamento`.\n"
        "- **Editar**: `/editar-faturamento/` + id.\n\n"
        "Na tela, confira **status**, **vencimento**, se é **pagamento ou recebimento** e anexos (boleto etc.). "
        "Contestação ou dúvida financeira: **imobiliária** / **financeiro**.",
    ),
    (
        re.compile(
            r"(como\s+usar|onde\s+fica|passo).{0,40}"
            r"(seguro\s+fian|fian[çc]a|an[aá]lise\s+cadastral|form\s*fian)",
            re.IGNORECASE,
        ),
        "No **seguro fiança (análise cadastral)**:\n\n"
        "- **Listagem**: `/listar-formfianca`.\n"
        "- **Nova análise**: `/add-formfianca`.\n"
        "- **Editar**: `/editar-formfianca/` + id.\n\n"
        "Fluxo: preencher etapas, enviar documentos e acompanhar **status** na lista ou na edição. "
        "Orçamento e emissão seguem a seguradora e o que a tela indicar.",
    ),
    (
        re.compile(
            r"(como\s+usar|onde\s+fica|passo).{0,40}(inc[êe]ndio|seguro\s+inc)",
            re.IGNORECASE,
        ),
        "No **seguro incêndio**:\n\n"
        "- **Listagem / orçamentos**: `/listar-seguroincendio`.\n"
        "- **Novo / orçamento**: `/novo-incendio` ou `/orcamento-seguroincendio/` + id.\n"
        "- **Acompanhar contratação**: `/acompanhar-seguroincendio/` + id.\n\n"
        "Há fluxo de incêndio **vinculado à fiança** pela própria análise (botões na tela).",
    ),
    (
        re.compile(
            r"(como\s+usar|onde\s+fica|passo).{0,50}(t[ií]tulo|capitaliza)",
            re.IGNORECASE,
        ),
        "No **título de capitalização**:\n\n"
        "- **Listagem**: `/listar-titulos`.\n"
        "- **Nova solicitação**: `/add-titulo`.\n"
        "- **Editar solicitação**: `/solicitacao-titulo/` + id.\n"
        "- **Proposta / apólice**: `/proposta-titulo/` ou `/apolice-titulo/` + id.\n\n"
        "Siga as etapas na tela até certificado/emissão conforme o status.",
    ),
]


def try_modulos_guia_canned_answer(message: str) -> Optional[str]:
    """
    Resposta fixa para 'como usar modulo' e 'como abrir sinistro' (sem LLM).
    Nao intercepta consultas com codigo AN/IN/CAP/FAT/SIN nem CPF/apolice numerica.
    """
    if not isinstance(message, str):
        return None
    raw = message.strip()
    if len(raw) < 15 or len(raw) > 800:
        return None
    low = raw.lower()
    if re.search(
        r"\b\d{3}\.?\d{3}\.?\d{3}-?\d{2}\b|\bcpf\b",
        low,
    ):
        return None
    if re.search(
        r"\b(AN|IN|CAP|FAT|SIN)[-–—\s]*\d{4}\d{2,12}\b",
        raw,
        re.IGNORECASE,
    ):
        return None
    if re.search(r"\bapólice\s+n[º°]\s*\d", low):
        return None
    for pattern, text in _CANNED:
        if pattern.search(raw):
            return text
    return None
