from types import SimpleNamespace

from src.domain.codegen.client_surface import required_client_operations
from src.domain.codegen.generation_plan import _auth_contract
from src.domain.projects.discovery_schemas import AuthenticationSpec


def test_generation_plan_auth_contract_is_per_audience_and_explicit() -> None:
    result = SimpleNamespace(
        spec=SimpleNamespace(
            authentication=AuthenticationSpec(
                required=True,
                audiences=["staff", "customer"],
                audience_methods={"staff": ["passwordless"], "customer": ["password"]},
                signup_audiences=["customer"],
            )
        )
    )

    contract = _auth_contract(result)

    assert contract is not None
    assert contract.methods_for("staff") == {"magic_link"}
    assert contract.methods_for("customer") == {"password"}
    customer = next(item for item in contract.audiences if item.audience == "customer")
    assert customer.signup_allowed is True
    assert customer.password_reset_allowed is True
    assert next(item for item in contract.audiences if item.audience == "staff").signup_allowed is False


def test_password_contract_requires_explicit_sdk_operations() -> None:
    plan = {
        "composition": {},
        "runtime": {
            "authentication_required": True,
            "auth_contract": {
                "audiences": [
                    {
                        "audience": "customer",
                        "methods": ["password"],
                    }
                ]
            },
        },
    }

    operations = required_client_operations(plan)

    assert "auth.password_sign_in" in operations
    assert "auth.password_reset_request" in operations
    assert "auth.password_reset_complete" in operations
