from src.domain.capability_evidence import (
    CapabilityProductionEvidence,
    EvidenceResult,
    EvidenceState,
    ProjectCapabilityReadiness,
    production_status_for,
    auth_production_evidence,
)


def test_production_status_is_derived_from_evidence() -> None:
    results = [
        EvidenceResult(dimension="authorization", state=EvidenceState.PROVEN),
        EvidenceResult(dimension="sdk_operation", state=EvidenceState.NOT_APPLICABLE),
    ]

    assert production_status_for(results) == "production_ready"
    assert CapabilityProductionEvidence(
        capability_id="crm.contact.upsert", contract_version="1", results=tuple(results)
    ).status == "production_ready"


def test_missing_evidence_cannot_be_overridden_by_a_flag() -> None:
    evidence = CapabilityProductionEvidence(
        capability_id="crm.contact.upsert",
        contract_version="1",
        results=(EvidenceResult(dimension="isolation", state=EvidenceState.MISSING),),
    )

    assert evidence.status == "capability_gap"
    assert ProjectCapabilityReadiness(
        project_id="p1",
        capability_id=evidence.capability_id,
        production_status=evidence.status,
    ).status == "capability_gap"


def test_project_configuration_is_separate_from_platform_evidence() -> None:
    readiness = ProjectCapabilityReadiness(
        project_id="p1",
        capability_id="crm.contact.upsert",
        production_status="production_ready",
        configuration_status="missing_connection",
        gaps=("connection_required",),
    )

    assert readiness.status == "configuration_required"


def test_auth_evidence_stays_incomplete_until_all_checks_pass() -> None:
    evidence = auth_production_evidence(
        contract_present=True,
        cloud_projection_matches=True,
        sdk_operations_available=True,
        authorization_proven=True,
        isolation_proven=True,
        failure_semantics_proven=True,
        conformance_tests_passed=False,
        reconciliation_strategy_defined=True,
    )

    assert evidence.status == "capability_gap"


def test_auth_evidence_is_method_specific() -> None:
    magic = auth_production_evidence(
        capability_id="auth.magic_link.staff",
        contract_present=True,
        cloud_projection_matches=True,
        sdk_operations_available=True,
        authorization_proven=True,
        isolation_proven=True,
        failure_semantics_proven=True,
        conformance_tests_passed=True,
        reconciliation_strategy_defined=True,
    )
    password = auth_production_evidence(
        capability_id="auth.password.customer",
        contract_present=True,
        cloud_projection_matches=True,
        sdk_operations_available=False,
        authorization_proven=True,
        isolation_proven=True,
        failure_semantics_proven=False,
        conformance_tests_passed=False,
        reconciliation_strategy_defined=True,
    )

    assert magic.status == "production_ready"
    assert password.status == "capability_gap"
    assert magic.capability_id != password.capability_id
