from app.parsers.icici_lombard import parse_icici_lombard
from app.parsers.registry import PARSER_REGISTRY, detect_company, detect_company_full_name_in_text
from tests.fixtures.icici_sample_text import (
    SAMPLE_ICICI_LETTER_TEXT,
    SAMPLE_ICICI_POLICY_TEXT,
    SAMPLE_ICICI_SCHEDULE_TEXT,
)


def test_detect_icici_company():
    code, name, confidence = detect_company(SAMPLE_ICICI_POLICY_TEXT)
    assert code == "icici_lombard"
    assert name == "ICICI Lombard"
    assert confidence >= 0.9


def test_detect_company_full_name_in_text_requires_display_name():
    code, name = detect_company_full_name_in_text(SAMPLE_ICICI_POLICY_TEXT)
    assert code == "icici_lombard"
    assert name == "ICICI Lombard"

    missing, unknown = detect_company_full_name_in_text("random invoice for services")
    assert missing is None
    assert unknown is None


def test_icici_parser_registered():
    assert PARSER_REGISTRY["icici_lombard"] is not None
    assert PARSER_REGISTRY["icici_lombard"].__name__ == "parse_icici_lombard"


def test_icici_parser_extracts_core_fields():
    result = parse_icici_lombard(SAMPLE_ICICI_POLICY_TEXT)
    field_map = result.get_field_map()

    assert result.company_code == "icici_lombard"
    assert field_map["policy_number"].value == "3005/MTR/12345678/00/00"
    assert field_map["customer_name"].value == "Rahul Kumar Sharma"
    assert field_map["mobile_number"].value == "9876543210"
    assert field_map["vehicle_registration_number"].value == "MH01AB1234"
    assert field_map["policy_end_date"].value == "Mar 14, 2026"
    assert field_map["policy_start_date"].value == "Mar 15, 2025"
    assert field_map["premium_amount"].value == "12450.00"
    assert field_map["email_address"].value == "rahul.sharma@example.com"
    assert field_map["idv"].value == "450000.00"
    assert field_map["ncb"].value == "20"
    assert field_map["coverage_type"].value == "comprehensive"
    assert field_map["vehicle_type"].value == "two_wheeler"


def test_icici_parser_confidence_threshold():
    result = parse_icici_lombard(SAMPLE_ICICI_POLICY_TEXT)
    mandatory = ["customer_name", "mobile_number", "policy_end_date", "policy_number"]
    for name in mandatory:
        assert name in result.get_field_map()
        assert result.get_field_map()[name].confidence >= 0.85


def test_icici_parser_prefers_schedule_page():
    schedule_only = parse_icici_lombard(SAMPLE_ICICI_SCHEDULE_TEXT)
    field_map = schedule_only.get_field_map()
    assert field_map["customer_name"].value == "Rahul Kumar Sharma"
    assert field_map["policy_number"].value == "3005/MTR/12345678/00/00"
    assert field_map["vehicle_registration_number"].value == "MH01AB1234"
    assert field_map["engine_number"].value == "ENG123456789"
    assert field_map["chassis_number"].value == "CHASSIS9876543210"
    assert field_map["vehicle_type"].value == "two_wheeler"

    letter_only = parse_icici_lombard(SAMPLE_ICICI_LETTER_TEXT)
    letter_map = letter_only.get_field_map()
    assert letter_map["customer_name"].value == "JASWANTI"
    assert letter_map["vehicle_registration_number"].value == "HR12AH0367"
