"""Tests for insurer-specific PDF parsers using sample text fixtures."""

import json
from pathlib import Path

import pytest

from app.parsers.registry import PARSER_REGISTRY, COMPANY_SIGNATURES
from tests.fixtures.pending_insurer_samples import PENDING_INSURER_SAMPLES

FIXTURES_PATH = Path(__file__).parent / "fixtures" / "pdf_samples.json"
KEY_FIELDS = [
    "policy_number",
    "customer_name",
    "mobile_number",
    "policy_end_date",
    "vehicle_registration_number",
]

MIN_KEY_FIELDS = {
    "bajaj_allianz": 2,
    "cholamandalam": 4,
    "hdfc_ergo": 3,
    "icici_lombard": 4,
    "iffco_tokio": 3,
    "liberty": 4,
    "magma_hdi": 4,
    "national": 4,
    "new_india": 3,
    "royal_sundaram": 3,
    "sbi_general": 4,
    "shriram_general": 3,
    "tata_aig": 3,
    "united_india": 3,
    "go_digit": 4,
    "reliance_general": 4,
    "oriental": 4,
    "future_generali": 4,
    "acko": 4,
}


@pytest.fixture(scope="module")
def pdf_samples() -> dict:
    return json.loads(FIXTURES_PATH.read_text(encoding="utf-8"))


@pytest.mark.parametrize("company_code", MIN_KEY_FIELDS.keys())
def test_parser_registered(company_code: str):
    parser = PARSER_REGISTRY.get(company_code)
    assert parser is not None
    assert parser.__name__ == f"parse_{company_code}"


@pytest.mark.parametrize("company_code,min_fields", MIN_KEY_FIELDS.items())
def test_parser_extracts_minimum_key_fields(pdf_samples: dict, company_code: str, min_fields: int):
    if company_code in PENDING_INSURER_SAMPLES:
        text = PENDING_INSURER_SAMPLES[company_code]
    else:
        text = pdf_samples[company_code]["text"]

    parser = PARSER_REGISTRY[company_code]
    result = parser(text)
    field_map = result.get_field_map()

    assert result.company_code == company_code
    found = sum(1 for key in KEY_FIELDS if field_map.get(key) and field_map[key].value)
    assert found >= min_fields, (
        f"{company_code}: expected >={min_fields} key fields, got {found}. "
        f"Missing: {[k for k in KEY_FIELDS if not field_map.get(k) or not field_map[k].value]}"
    )


def test_all_sample_insurers_have_dedicated_parser():
    samples = json.loads(FIXTURES_PATH.read_text(encoding="utf-8"))
    for code in samples:
        assert PARSER_REGISTRY[code].__name__ == f"parse_{code}"


def test_all_detectable_insurers_have_dedicated_parser():
    """Every company in COMPANY_SIGNATURES should have a dedicated parser."""
    for code, _, _ in COMPANY_SIGNATURES:
        assert PARSER_REGISTRY[code].__name__ == f"parse_{code}", f"{code} still uses generic parser"
