from pydantic import ValidationError
import pytest

from src.domain.requirements import (
    FulfillmentStatus,
    RequirementDefinition,
    RequirementInstance,
    RequirementTransition,
)


def test_requirement_is_not_limited_to_documents():
    definition = RequirementDefinition(key="identity_verified", label="Identity verified", evidence_kind="fact")
    assert definition.evidence_kind == "fact"


def test_requirement_evidence_is_an_opaque_record_reference():
    instance = RequirementInstance(
        definition_key="passport",
        subject_entity_key="application",
        subject_record_id="app_123",
        status=FulfillmentStatus.SUBMITTED,
        evidence_entity_key="file_attachment",
        evidence_record_id="file_456",
    )
    assert instance.subject_record_id == "app_123"
    assert instance.evidence_record_id == "file_456"


def test_review_and_waiver_require_audit_context():
    with pytest.raises(ValidationError):
        RequirementInstance(
            definition_key="passport",
            subject_entity_key="application",
            subject_record_id="app_123",
            status=FulfillmentStatus.APPROVED,
        )
    with pytest.raises(ValidationError):
        RequirementInstance(
            definition_key="fee_paid",
            subject_entity_key="application",
            subject_record_id="app_123",
            status=FulfillmentStatus.WAIVED,
        )


def test_requirement_transition_is_not_a_boolean_checklist():
    transition = RequirementTransition(
        from_status=FulfillmentStatus.REJECTED,
        to_status=FulfillmentStatus.SUBMITTED,
        actor_user_id="staff_1",
    )
    assert transition.to_status == FulfillmentStatus.SUBMITTED
    with pytest.raises(ValidationError):
        RequirementTransition(
            from_status=FulfillmentStatus.REQUIRED,
            to_status=FulfillmentStatus.APPROVED,
            actor_user_id="staff_1",
        )
