"""Training examples apply at upload when no saved patterns exist."""

from types import SimpleNamespace
from unittest.mock import MagicMock

from app.parsers.base import ExtractedField
from app.services.parser_training_service import ParserTrainingService


def test_apply_learned_patterns_uses_training_examples_when_no_patterns():
    example = SimpleNamespace(
        id=5,
        field_name="customer_name",
        value="MR RAJESH KUMAR",
        anchor_before="Insured ",
        anchor_after=" S/O",
        page=1,
        company_code="iffco_tokio",
    )

    db = MagicMock()
    db.query.return_value.filter.return_value.first.side_effect = [example, None]
    db.query.return_value.filter.return_value.order_by.return_value.first.return_value = (
        "iffco_tokio",
        18,
    )
    db.query.return_value.filter.return_value.order_by.return_value.all.side_effect = [
        [],
        [example],
    ]
    db.query.return_value.filter.return_value.group_by.return_value.order_by.return_value.first.return_value = (
        "iffco_tokio",
        18,
    )

    existing = [ExtractedField(field_name="customer_name", value="WRONG", confidence=0.9)]
    text = "Insured MR RAJESH KUMAR S/O Rohtak"

    result = ParserTrainingService.apply_learned_patterns(db, 1, "iffco_tokio", text, existing)
    by_name = {field.field_name: field for field in result}
    assert by_name["customer_name"].value == "MR RAJESH KUMAR"
    assert by_name["customer_name"].source == "learned_example"
