from __future__ import annotations


BASE_TRANSCRIPTION = (
    "Transcreve todo o texto visivel desta imagem exactamente como esta escrito. "
    "Preserva linhas, numeros, sinais '<', acentos e etiquetas. "
    "Nao expliques, nao interpretes, nao corrijas e nao inventes. "
    "Se nada for legivel, responde apenas [NAO_LEGIVEL]."
)

TYPE_HINTS = {
    "cc_frente": "O documento esperado e a frente de um Cartao de Cidadao.",
    "cc_verso": "O documento esperado e o verso de um Cartao de Cidadao; preserva a MRZ.",
    "cc_ambos": "A imagem pode conter frente e verso de um Cartao de Cidadao.",
    "tr_frente": "O documento esperado e a frente de um Titulo de Residencia.",
    "tr_verso": "O documento esperado e o verso de um Titulo de Residencia; preserva a MRZ.",
    "tr_ambos": "A imagem pode conter frente e verso de um Titulo de Residencia.",
    "passaporte": "O documento esperado e um passaporte; preserva exactamente as linhas MRZ.",
    "vig": "O documento esperado e um cartao profissional de seguranca privada.",
    "spr": "O documento esperado e um cartao profissional de seguranca-porteiro.",
    "ard": "O documento esperado e um cartao de assistente de recinto desportivo.",
    "are": "O documento esperado e um cartao de assistente de recinto de espectaculos.",
    "rc": "O documento esperado e um certificado de registo criminal.",
    "iban": "O documento esperado contem um IBAN; transcreve letras e algarismos sem os corrigir.",
}

FOCUSED_TRANSCRIPTIONS = {
    "cc_frente_identificacao": (
        "Localiza exclusivamente na frente do Cartao de Cidadao as linhas com os rotulos "
        "N.º DOCUMENTO ou DOCUMENT No. e VALIDADE ou EXPIRY. Transcreve apenas essas linhas "
        "que estejam visiveis, incluindo cada rotulo e o respectivo valor, caracter a caracter. "
        "Nao uses a data de nascimento nem numeros fiscais, de seguranca social ou de saude. "
        "Nao corrijas, nao completes e nao adivinhes. Se nenhuma dessas linhas for legivel com "
        "certeza, responde apenas [NAO_LEGIVEL]."
    ),
    "rc_validade": (
        "Localiza a linha com o rotulo CODIGO VIGENTE ATE ou access code valid until. "
        "Transcreve apenas essa linha, caracter a caracter, incluindo o rotulo e a data. "
        "Nao uses outras datas. Se a linha nao for legivel, responde apenas [NAO_LEGIVEL]."
    ),
    "rc_validade_focada": (
        "Localiza exclusivamente as linhas DATA DE EMISSAO ou date of issue e CODIGO VIGENTE ATE "
        "ou access code valid until. Transcreve apenas as linhas visiveis, incluindo os rotulos e "
        "as datas, caracter a caracter. Nao calcules datas, nao corrijas e nao uses outras datas. "
        "Se nenhuma dessas linhas for legivel com certeza, responde apenas [NAO_LEGIVEL]."
    ),
    "rc_naturalidade": (
        "Localiza exclusivamente a linha NATURAL DA FREG. ou NATURALIDADE, identificada tambem por "
        "place of birth. Transcreve apenas essa linha completa, incluindo o rotulo e o valor. "
        "Nao uses o concelho, distrito, comarca ou nacionalidade. "
        "Se a linha nao for legivel com certeza, responde apenas [NAO_LEGIVEL]."
    ),
}

def transcription_prompt(document_type: str | None, model: str = "") -> str:
    model_name = model.strip().lower()
    if model_name.startswith("glm-ocr"):
        # Prompt canonico do GLM-OCR. Prompts conversacionais longos fazem este
        # modelo continuar a gerar em vez de terminar a transcricao.
        return "Text Recognition:"
    normalized = (document_type or "").strip().lower()
    if normalized in FOCUSED_TRANSCRIPTIONS:
        return FOCUSED_TRANSCRIPTIONS[normalized]
    hint = TYPE_HINTS.get(normalized, "")
    return f"{hint} {BASE_TRANSCRIPTION}".strip()
