"""Typed fail-closed route gate for nutrition owner callbacks."""

from __future__ import annotations

from dataclasses import dataclass
from enum import StrEnum


class NutritionDraftCallbackDenialReason(StrEnum):
    ROUTE_UNAVAILABLE = "route_unavailable"
    WRONG_USER = "wrong_user"
    WRONG_CHAT = "wrong_chat"
    WRONG_TOPIC = "wrong_topic"


@dataclass(frozen=True, slots=True)
class NutritionDraftCallbackDenied:
    reason: NutritionDraftCallbackDenialReason


def nutrition_draft_callback_route_denial(
    actual: tuple[str, str, str],
    canonical: tuple[str, str, str] | None,
) -> NutritionDraftCallbackDenied | None:
    """Compare each source-route component without provider side effects."""
    if canonical is None:
        return NutritionDraftCallbackDenied(
            NutritionDraftCallbackDenialReason.ROUTE_UNAVAILABLE,
        )
    if actual[0] != canonical[0]:
        return NutritionDraftCallbackDenied(
            NutritionDraftCallbackDenialReason.WRONG_USER,
        )
    if actual[1] != canonical[1]:
        return NutritionDraftCallbackDenied(
            NutritionDraftCallbackDenialReason.WRONG_CHAT,
        )
    if actual[2] != canonical[2]:
        return NutritionDraftCallbackDenied(
            NutritionDraftCallbackDenialReason.WRONG_TOPIC,
        )
    return None