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_multi_residence_aggregation(monkeypatch):
    raw = {
        "file_type": "residence_documents",
        "file_urls": [
            "https://example.com/docA.jpg",
            "https://example.com/docB.jpg"
        ],
        "data": {
            "first_name": "John",
            "middle_name": "",
            "last_name": "Doe",
            "city": "Sample City",
            "state": "CA",
            "county": "USA",
            "zip_code": "90001",
            "street_name": "Main Street",
            "house_number": "100"
        }
    }
    req = MultiDocumentVerificationRequest.from_raw(raw)

    async def fake_verify_document(file_type, payload, file_url):
        if file_url.endswith('docA.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": "city", "provided_value": payload["city"], "found_in_document": "Sample City", "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, "confidence_score": "80%", "document_type": "Lease", "is_hazy": False}
        else:
            return {"analysis_results": [
                {"field_name": "last_name", "provided_value": payload["last_name"], "found_in_document": payload["last_name"], "is_match": True, "confidence": "high"},
                {"field_name": "city", "provided_value": payload["city"], "found_in_document": "Sample City", "is_match": True, "confidence": "high"},
                {"field_name": "street_name", "provided_value": payload["street_name"], "found_in_document": "Main St", "is_match": False, "confidence": "medium"}
            ], "overall_match": False, "confidence_score": "75%", "document_type": "Utility Bill", "is_hazy": True}

    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.success is True
    # Check merged analysis includes key fields
    field_names = {r.field_name for r in resp.analysis_results}
    assert 'first_name' in field_names
    assert 'last_name' in field_names
    assert 'city' in field_names
    assert 'house_number' in field_names
    # Feedback classification
    assert 'first_name' in resp.feedback['fully_matched']
    assert 'last_name' in resp.feedback['fully_matched']
    # street_name should appear as partial or not matched depending on found_in_document
    assert 'street_name' in (resp.feedback['partially_matched'] + resp.feedback['not_matched'])
