from __future__ import annotations

from dataclasses import dataclass

import pytest

from gateway.platforms.nutrition_coaching import (
    NutritionCoachingCoordinator,
    NutritionCoachingIntegrationError,
)

_CANDIDATE_DIGEST = "a" * 64


@dataclass(frozen=True, slots=True)
class _AdmissionPolicy:
    candidate_digest: str


@dataclass(frozen=True, slots=True)
class _RegistryView:
    admission_policy: _AdmissionPolicy | None


def _coordinator(candidate_digest: str | None) -> NutritionCoachingCoordinator:
    coordinator = object.__new__(NutritionCoachingCoordinator)
    coordinator._task26_candidate_digest = candidate_digest
    return coordinator


@pytest.mark.parametrize("candidate_digest", [None, "b" * 64])
def test_multi_customer_runtime_rejects_wrong_candidate(
    candidate_digest: str | None,
) -> None:
    coordinator = _coordinator(candidate_digest)
    registry = _RegistryView(_AdmissionPolicy(_CANDIDATE_DIGEST))

    with pytest.raises(
        NutritionCoachingIntegrationError,
        match="multi-customer candidate authority",
    ):
        coordinator._require_multi_customer_candidate_authority(registry)


def test_multi_customer_runtime_accepts_exact_candidate() -> None:
    coordinator = _coordinator(_CANDIDATE_DIGEST)
    registry = _RegistryView(_AdmissionPolicy(_CANDIDATE_DIGEST))

    coordinator._require_multi_customer_candidate_authority(registry)


def test_single_customer_runtime_needs_no_candidate_binding() -> None:
    coordinator = _coordinator(None)
    registry = _RegistryView(None)

    coordinator._require_multi_customer_candidate_authority(registry)
