"""Offline preparation exercise: classify fictitious SOAP contracts.

No network access, no Business Central compatibility certification.
Run with Python 3.10+: python3 migration_inventory.py
"""
from dataclasses import dataclass, replace


@dataclass(frozen=True)
class Contract:
    object_origin: str | None
    writes: bool
    standard_coverage: bool | None


def preparation(contract: Contract) -> str:
    if type(contract.writes) is not bool:
        raise ValueError("An explicit read/write decision is required.")
    if contract.standard_coverage is not None and type(contract.standard_coverage) is not bool:
        raise ValueError("Coverage must be qualified as true, false or unknown.")
    if contract.object_origin is None:
        return "INVENTORY_REQUIRED"
    if contract.object_origin == "codeunit":
        return "ACTION_EQUIVALENCE_REVIEW"
    if contract.object_origin == "custom_page":
        return "CUSTOM_SOAP_REVIEW"
    if contract.object_origin != "microsoft_page":
        return "INVENTORY_REQUIRED"
    if contract.standard_coverage is None:
        return "COVERAGE_REVIEW"
    if contract.standard_coverage:
        return "STANDARD_API_RECIPE"
    return "API_PAGE_SPECIFICATION" if contract.writes else "READ_INTERFACE_STUDY"


CASES = {
    "A": (Contract("microsoft_page", False, True), "STANDARD_API_RECIPE"),
    "B": (Contract("microsoft_page", True, False), "API_PAGE_SPECIFICATION"),
    "C": (Contract("microsoft_page", False, False), "READ_INTERFACE_STUDY"),
    "D": (Contract("codeunit", True, None), "ACTION_EQUIVALENCE_REVIEW"),
    "E": (Contract("custom_page", False, None), "CUSTOM_SOAP_REVIEW"),
    "F": (Contract(None, False, None), "INVENTORY_REQUIRED"),
}


def verify() -> int:
    checks = 0
    for label, (contract, expected) in CASES.items():
        assert preparation(contract) == expected, label
        assert preparation(replace(contract, object_origin=None)) == "INVENTORY_REQUIRED", label
        checks += 2
    assert preparation(Contract("microsoft_page", True, None)) == "COVERAGE_REVIEW"
    assert preparation(Contract("microsoft_page", True, True)) == "STANDARD_API_RECIPE"
    assert preparation(Contract("unknown_extension", True, True)) == "INVENTORY_REQUIRED"
    checks += 3
    for invalid in (Contract("microsoft_page", "yes", True), Contract("microsoft_page", True, "yes")):
        try:
            preparation(invalid)
        except ValueError:
            checks += 1
        else:
            raise AssertionError("An unqualified field was silently accepted.")
    return checks


if __name__ == "__main__":
    print(f"{verify()} offline assertions passed; no ERP endpoint called.")
    for name, (case, _) in CASES.items():
        print(name, preparation(case))
