"""Upload path applies agency learned parser patterns at extraction time."""

from unittest.mock import MagicMock, patch

from app.parsers.base import ExtractedField, ExtractionResultData
from app.services.upload_service import UploadService


def test_extract_pdf_applies_learned_patterns():
    db = MagicMock()
    service = UploadService(db)

    baseline_fields = [
        ExtractedField(field_name="customer_name", value="WRONG", confidence=0.9),
    ]
    learned_fields = [
        ExtractedField(
            field_name="customer_name",
            value="MR RAJESH KUMAR",
            confidence=0.96,
            source="learned_pattern",
        ),
    ]
    parser_result = ExtractionResultData(
        company_code="iffco_tokio",
        company_name="IFFCO Tokio",
        fields=baseline_fields,
    )

    with (
        patch.object(service, "_ensure_upload_dir"),
        patch("app.services.upload_service.get_file_storage") as storage_mock,
        patch("app.services.upload_service.scan_file_bytes"),
        patch("app.services.upload_service.pack_raw_text_fields") as pack_mock,
        patch("app.services.upload_service.detect_company") as detect_mock,
        patch("app.services.upload_service.PARSER_REGISTRY") as registry_mock,
        patch(
            "app.services.parser_training_service.ParserTrainingService.apply_learned_patterns",
            return_value=learned_fields,
        ) as apply_mock,
    ):
        storage = storage_mock.return_value
        storage.save.return_value = "1/test.pdf"
        pack_mock.return_value = {
            "raw_text": "IFFCO Tokio policy text",
            "raw_text_pages": [{"page": 1, "text": "IFFCO Tokio policy text"}],
            "page_count": 1,
            "text_source": "native",
            "ocr_engine": None,
            "is_scanned": False,
        }
        detect_mock.return_value = ("iffco_tokio", "IFFCO Tokio", 0.95)
        registry_mock.get.return_value = MagicMock(return_value=parser_result)

        db.add = MagicMock()
        db.commit = MagicMock()
        db.refresh = MagicMock(side_effect=lambda row: setattr(row, "id", 99))

        result = service.extract_pdf(b"%PDF-1.4", "iffco_policy.pdf", user_id=1, agency_id=1)

    apply_mock.assert_called_once()
    assert apply_mock.call_args.args[2] == "iffco_tokio"
    assert result["fields"][0]["value"] == "MR RAJESH KUMAR"
    assert result["fields"][0]["source"] == "learned_pattern"
