"""Typed authority for bounded multi-customer admission migration."""

from __future__ import annotations

from dataclasses import dataclass
from enum import StrEnum
from typing import override


class AdmissionMigrationRejectReason(StrEnum):
    """Stable fail-closed migration reasons."""

    AFTER = "after"
    APPROVAL = "approval"
    BEFORE = "before"
    CANDIDATE = "candidate"
    CAPACITY = "capacity"
    MODE = "mode"
    PROPOSAL = "proposal"
    REGISTRY = "registry"
    STATE = "state"


@dataclass(frozen=True, slots=True)
class AdmissionMigrationError(ValueError):
    """A bounded admission migration was rejected before persistence."""

    reason: AdmissionMigrationRejectReason

    @override
    def __str__(self) -> str:
        return self.reason.value


@dataclass(frozen=True, slots=True)
class AdmissionMigrationProposal:
    """Immutable registry transition requiring exact owner approval."""

    before_sha256: str
    after_sha256: str
    candidate_digest: str
    max_enabled_customers: int
    proposal_digest: str

    @property
    def approval_phrase(self) -> str:
        """Return the exact one-use approval phrase."""
        return f"AUTHORIZE NUTRICOACH MULTI CUSTOMER V1 {self.proposal_digest}"
