"""Prompts fechados por tipo de documento e para a comparacao semantica.

Cada prompt instrui o Qwen a devolver APENAS um objeto JSON (sem markdown,
sem comentarios) que cumpra o schema correspondente em schemas/<tipo>.json.
Campos nao encontrados na imagem ficam de fora ou com string vazia -- o
Qwen nunca inventa dados.
"""

INSTRUCAO_COMUM = (
    "Le atentamente a(s) imagem(ns) fornecida(s), que sao pagina(s) de um "
    "documento oficial portugues. Devolve APENAS um objeto JSON valido, "
    "sem markdown, sem texto antes ou depois, sem comentarios. "
    "Se um campo nao estiver visivel ou legivel, omite-o ou usa string vazia. "
    "Nunca inventes valores. Datas no formato AAAA-MM-DD."
)

PROMPTS = {
    "cartao_psp": (
        INSTRUCAO_COMUM
        + "\n\nDocumento: cartao profissional de vigilante emitido pela PSP "
        "(Policia de Seguranca Publica), no ambito da atividade de seguranca "
        "privada. Extrai:\n"
        "- numero: o numero do cartao, exatamente 9 digitos, sem espacos.\n"
        "- categoria_texto: uma de 'Vigilante', 'Seguranca-Porteiro', "
        "'Ass. Recinto Desportivo', 'Ass. Recinto Espetaculos', conforme "
        "impresso no cartao.\n"
        "- categoria_sufixo: o sufixo de 3 letras correspondente, se visivel "
        "(VIG, SPR, ARD ou ARE).\n"
        "- validade: a data de validade do cartao (AAAA-MM-DD).\n"
        "- titular: o nome completo do titular, se visivel.\n"
        "Responde so com o objeto JSON com estes campos."
    ),
    "cc_frente": (
        INSTRUCAO_COMUM
        + "\n\nDocumento: frente do Cartao de Cidadao portugues. Extrai:\n"
        "- nome: nome completo tal como impresso.\n"
        "- ncc: numero do cartao de cidadao (ate 10 caracteres, incluindo "
        "digitos de controlo se existirem).\n"
        "- nascimento: data de nascimento (AAAA-MM-DD).\n"
        "- validade_cc: data de validade do cartao (AAAA-MM-DD).\n"
        "- nif: numero de identificacao fiscal, exatamente 9 digitos, se "
        "impresso no cartao.\n"
        "Responde so com o objeto JSON com estes campos."
    ),
    "cc_verso": (
        INSTRUCAO_COMUM
        + "\n\nDocumento: verso do Cartao de Cidadao portugues (inclui a zona "
        "MRZ de leitura otica, duas ou tres linhas no fundo do cartao). "
        "Extrai:\n"
        "- niss: numero de identificacao da seguranca social, exatamente 11 "
        "digitos, se impresso.\n"
        "- filho_de: nomes dos progenitores, se impressos.\n"
        "- mrz_linha2: a segunda linha da zona MRZ tal como aparece "
        "(nascimento, digito de controlo, sexo, validade no formato AAMMDD), "
        "para conferencia cruzada -- copia os caracteres exatamente, sem "
        "interpretar.\n"
        "Responde so com o objeto JSON com estes campos."
    ),
    "cc_digital": (
        INSTRUCAO_COMUM
        + "\n\nDocumento: captura de ecra da app oficial 'Chave Movel Digital' "
        "ou do cartao de cidadao digital na app gov.pt. As datas aqui "
        "aparecem no formato dd-mm-aaaa (distinto do cartao fisico, que usa "
        "dd mm aaaa por extenso ou separado). Extrai:\n"
        "- nome: nome completo.\n"
        "- ncc: numero do cartao de cidadao, se visivel.\n"
        "- nascimento: data de nascimento (AAAA-MM-DD).\n"
        "- validade_cc: data de validade (AAAA-MM-DD).\n"
        "- formato_origem: usa sempre o valor fixo 'app_govpt'.\n"
        "Responde so com o objeto JSON com estes campos."
    ),
    "rc": (
        INSTRUCAO_COMUM
        + "\n\nDocumento: Registo Criminal emitido pelo Ministerio da Justica "
        "portugues (certificado de registo criminal). Extrai:\n"
        "- val_rc: a data indicada como 'CODIGO VIGENTE ATE' (nunca a data de "
        "emissao do certificado) -- AAAA-MM-DD. Este campo e obrigatorio.\n"
        "- finalidade: a finalidade declarada no certificado (ex. 'exercicio "
        "da atividade de seguranca privada'). Campo obrigatorio.\n"
        "- naturalidade: naturalidade do titular, se indicada.\n"
        "- concelho: concelho de naturalidade ou de residencia, se indicado.\n"
        "- nacionalidade: nacionalidade do titular, se indicada.\n"
        "- condenacao: true se o certificado menciona alguma condenacao ou "
        "registo de pena, false se declarar ausencia de registo.\n"
        "- condenacao_texto: o texto relevante sobre condenacoes, se existir.\n"
        "Responde so com o objeto JSON com estes campos."
    ),
    "morada": (
        INSTRUCAO_COMUM
        + "\n\nDocumento: comprovativo de morada (fatura de servico, certidao, "
        "carta verde de seguro, ou semelhante -- raramente e um documento "
        "chamado literalmente 'comprovativo de morada'). Extrai:\n"
        "- morada_original: a morada tal como impressa no documento, sem "
        "normalizar nem corrigir abreviaturas.\n"
        "- tipo_documento_real: identifica que tipo de documento e este de "
        "facto (ex. 'fatura EDP', 'certidao AT', 'carta verde de seguro').\n"
        "Responde so com o objeto JSON com estes campos."
    ),
    "iban": (
        INSTRUCAO_COMUM
        + "\n\nDocumento: comprovativo de IBAN (documento bancario, talao "
        "multibanco, ou semelhante). Extrai:\n"
        "- iban: o IBAN completo, sem espacos, formato duas letras + dois "
        "digitos + ate 30 caracteres alfanumericos. Campo obrigatorio -- se "
        "o IBAN estiver parcialmente ocultado (mascarado), deixa este campo "
        "vazio.\n"
        "- mascarado: true se o documento mostra o IBAN parcialmente "
        "ocultado (ex. talao multibanco que so mostra os ultimos digitos), "
        "false caso contrario.\n"
        "Responde so com o objeto JSON com estes campos."
    ),
}

TIPOS_VALIDOS = tuple(PROMPTS.keys())


def prompt_para_tipo(tipo: str) -> str:
    if tipo not in PROMPTS:
        raise KeyError(tipo)
    return PROMPTS[tipo]


def prompt_comparacao(campo: str, valor_a: str, valor_b: str) -> str:
    return (
        "Compara os dois valores seguintes para o campo '" + campo + "' de um "
        "documento oficial portugues e decide se representam a mesma "
        "informacao, apesar de possiveis diferencas de escrita (abreviaturas, "
        "maiusculas/minusculas, ordem das palavras, pontuacao, acentuacao).\n\n"
        "Valor A: " + valor_a + "\n"
        "Valor B: " + valor_b + "\n\n"
        "Devolve APENAS um objeto JSON, sem markdown, sem texto adicional, "
        "com exatamente estes campos:\n"
        '{"equivalente": true ou false, "motivo": "explicacao curta em '
        'portugues de Portugal"}\n'
        "Considera equivalentes apenas se se referirem claramente ao mesmo "
        "valor real (mesma morada, mesmo nome, mesma data, etc.), mesmo que "
        "escritos de forma diferente. Nao consideres equivalentes valores "
        "que sejam de facto diferentes."
    )


PROMPT_CLASSIFICAR = """Es um classificador de documentos de recursos humanos portugueses.
Olha para a imagem e responde SO com um objeto JSON: {"tipo": "<tipo>"}.
Tipos possiveis (escolhe exatamente um):
- "cc_frente": frente do Cartao de Cidadao (fotografia, nome, apelido, data de nascimento, numero do documento, validade).
- "cc_verso": verso do Cartao de Cidadao (NIF, NISS, numero de utente, filiacao, linhas MRZ com "<<<" em baixo). Mesmo que diga "Cartao de Cidadao" ou "Identity Card", se tem filiacao ou MRZ e verso.
- "cc_digital": Cartao de Cidadao digital (app gov.pt / autenticacao.gov), frente e verso no mesmo ecra ou PDF.
- "cartao_psp": cartao profissional de seguranca privada emitido pela PSP / SGMAI (vigilante, porteiro, ARD, ARE, etc.).
- "rc": certificado de registo criminal.
- "morada": comprovativo de morada (fatura, certidao da AT, carta de entidade, atestado de residencia).
- "iban": comprovativo de IBAN / declaracao bancaria.
- "outro": qualquer outra coisa.
Nao escrevas mais nada alem do JSON."""
