from pataniscai.engine import Engine, InputDocument
from pataniscai.ollama import OllamaResult
from pataniscai.prompts import transcription_prompt


class FakeClient:
    model = "modelo-teste"

    def transcribe(self, image: bytes, prompt: str, document_type: str = "") -> OllamaResult:
        assert image == b"imagem"
        assert "Nao expliques" in prompt
        assert document_type == "cc_verso"
        return OllamaResult("NISS 123", 3, 2_000_000)


def test_engine_returns_transcription_without_logging_or_parsing_fields() -> None:
    result = Engine(FakeClient()).extract(
        [InputDocument("doc-1", "verso.png", "cc_verso", b"imagem")]
    )
    assert result["success"] is True
    assert result["results"] == {}
    assert result["transcriptions"][0]["text"] == "NISS 123"
    assert result["documents"][0]["ocr_ok"] is True


def test_rc_focused_prompt_forbids_other_dates_and_guessing() -> None:
    prompt = transcription_prompt("rc_validade")
    assert "VIGENTE ATE" in prompt
    assert "Nao uses outras datas" in prompt
    assert "[NAO_LEGIVEL]" in prompt


def test_rc_geometric_focus_transcribes_issue_and_validity_without_calculating() -> None:
    prompt = transcription_prompt("rc_validade_focada")
    assert "DATA DE EMISSAO" in prompt
    assert "CODIGO VIGENTE ATE" in prompt
    assert "Nao calcules datas" in prompt
    assert "Nao corrijas" in prompt
    assert "[NAO_LEGIVEL]" in prompt


def test_glm_uses_canonical_short_prompt() -> None:
    assert transcription_prompt("rc_validade", "glm-ocr:latest") == "Text Recognition:"


def test_paddle_rc_prompt_still_requests_full_transcription() -> None:
    prompt = transcription_prompt("rc", "AuditAid/PaddleOCR-VL-1.6-0.9B:latest")
    assert "Transcreve todo o texto visivel" in prompt
    assert "Omite todo o restante texto" not in prompt


def test_cc_front_focused_prompt_forbids_guessing_and_other_numbers() -> None:
    prompt = transcription_prompt("cc_frente_identificacao")
    assert "N.º DOCUMENTO" in prompt
    assert "VALIDADE" in prompt
    assert "data de nascimento" in prompt
    assert "Nao corrijas, nao completes e nao adivinhes" in prompt
    assert "[NAO_LEGIVEL]" in prompt
