from types import SimpleNamespace

from app.utils.pattern_promote import build_promote_preview
from app.utils.pattern_tester import evaluate_regression


def test_regression_passed_flag_when_all_match():
    results = [
        {"file": "a.pdf", "matched": True},
        {"file": "b.pdf", "matched": True},
    ]
    failed = [row for row in results if not row["matched"]]
    passed = len(results) == 0 or len(failed) == 0
    assert passed is True


def test_regression_failed_when_any_sample_fails():
    results = [
        {"file": "a.pdf", "matched": True},
        {"file": "b.pdf", "matched": False},
    ]
    failed = [row for row in results if not row["matched"]]
    passed = len(results) == 0 or len(failed) == 0
    assert passed is False
    assert len(failed) == 1


def test_evaluate_regression_returns_passed_key():
    result = evaluate_regression("united_india", "customer_name", r"does-not-match-anything-xyz")
    assert "passed" in result
    assert "failed_files" in result
    if result["total_files"] > 0:
        assert result["passed"] is False


def test_build_promote_preview_snippet():
    pattern = SimpleNamespace(
        id=7,
        company_code="united_india",
        field_name="customer_name",
        regex=r"Insured\s+(MR\s+[A-Z]+)\s+S/O",
        page_hint=1,
    )
    preview = build_promote_preview(pattern)
    assert preview["target_file"] == "api/app/parsers/united_india.py"
    assert "customer_name" in preview["snippet"]
    assert preview["page_hint"] == 1
    assert preview["instructions"]


def test_apply_learned_patterns_trained_override_wins():
    from unittest.mock import MagicMock

    from app.parsers.base import ExtractedField
    from app.services.parser_training_service import ParserTrainingService

    pattern = MagicMock()
    pattern.field_name = "customer_name"
    pattern.regex = r"Insured\s+(.+?)\s+S/O"
    pattern.page_hint = None
    pattern.priority = 100
    pattern.source_training_example_id = 12
    pattern.active = True

    db = MagicMock()
    db.query.return_value.filter.return_value.order_by.return_value.all.return_value = [pattern]

    existing = [ExtractedField(field_name="customer_name", value="WRONG NAME", confidence=0.95)]
    text = "Insured MR KRISHAN KUMAR S/O Delhi"

    result = ParserTrainingService.apply_learned_patterns(db, 1, "united_india", text, existing)
    by_name = {field.field_name: field for field in result}
    assert by_name["customer_name"].value == "MR KRISHAN KUMAR"
    assert by_name["customer_name"].source == "learned_pattern"
