import pytest
from src.modules.prompt.schemas.requests import MultiDocumentVerificationRequest
from src.modules.prompt.controller import verify_multi_documents

class DummyRequest: pass
class DummySession: pass

@pytest.mark.asyncio
async def test_per_file_feedback(monkeypatch):
    raw = {
        "file_type": "residence_documents",
        "file_urls": ["https://example.com/doc1.jpg", "https://example.com/doc2.jpg"],
        "data": {
            "first_name": "Jane",
            "middle_name": "A",
            "last_name": "Doe",
            "city": "Metro",
            "state": "CA",
            "county": "USA",
            "zip_code": "99999",
            "street_name": "Elm Street",
            "house_number": "42"
        }
    }
    req = MultiDocumentVerificationRequest.from_raw(raw)

    async def fake_verify_document(file_type, payload, file_url):
        if file_url.endswith('doc1.jpg'):
            return {"analysis_results": [
                {"field_name": "first_name", "provided_value": payload["first_name"], "found_in_document": payload["first_name"], "is_match": True, "confidence": "high"},
                {"field_name": "last_name", "provided_value": payload["last_name"], "found_in_document": "Do", "is_match": False, "confidence": "medium"},
                {"field_name": "street_name", "provided_value": payload["street_name"], "found_in_document": "Elm St", "is_match": False, "confidence": "low"}
            ], "overall_match": False, "document_type": "Lease", "is_hazy": False}
        else:
            return {"analysis_results": [
                {"field_name": "first_name", "provided_value": payload["first_name"], "found_in_document": payload["first_name"], "is_match": True, "confidence": "high"},
                {"field_name": "house_number", "provided_value": payload["house_number"], "found_in_document": None, "is_match": False, "confidence": "low"}
            ], "overall_match": False, "document_type": "Utility Bill", "is_hazy": False}

    from src.modules.prompt import controller as controller_module
    monkeypatch.setattr(controller_module.azure_openai_client, "verify_document", fake_verify_document)

    resp = await verify_multi_documents(DummySession(), req, DummyRequest())
    assert resp.per_file_results is not None
    assert len(resp.per_file_results) == 2
    for pf in resp.per_file_results:
        assert 'feedback' in pf
        fb = pf['feedback']
        assert 'fully_matched' in fb and 'partially_matched' in fb and 'not_matched' in fb
        # ensure classification makes sense
    # doc1 expectations
    doc1_fb = resp.per_file_results[0]['feedback']
    assert 'first_name' in doc1_fb['fully_matched']
    assert 'last_name' in (doc1_fb['partially_matched'] + doc1_fb['not_matched'])
    # doc2 expectations
    doc2_fb = resp.per_file_results[1]['feedback']
    assert 'house_number' in doc2_fb['not_matched']
