#!/usr/bin/env -S uv run --script
# /// script
# requires-python = ">=3.12"
# dependencies = []
# ///

# ─── How to run ───
# 1. Install uv: curl -LsSf https://astral.sh/uv/install.sh | sh
# 2. Use through: uv run python scripts/run_nutricoach_v140_golden_path.py --help
# ──────────────────

"""Typed facade over the production Telegram weekly tick."""

from __future__ import annotations

from collections.abc import Mapping
from datetime import datetime
from pathlib import Path
from typing import final, override

from checkin_cli.customer_coaching import load_customer_registry
from gateway.platforms.base import SendResult
from gateway.platforms.nutrition_coaching import NutritionCoachingCoordinator
from gateway.platforms.nutrition_weekly_owner_model import JsonValue
from gateway.platforms.nutrition_weekly_reminder_owner_factory import WeeklyReminderProductionInput
from gateway.platforms.telegram import TelegramAdapter
from scripts.nutricoach_v140_golden_path_models import CliError
from scripts.nutricoach_v140_golden_path_profile import CANDIDATE, load_platform_config
from scripts.nutricoach_v140_golden_path_transport import DurableFakeTelegram


@final
class GoldenPathTelegramAdapter(TelegramAdapter):
    """Expose only the protected authorized production tick for Todo10."""

    _golden_coordinator: NutritionCoachingCoordinator | None = None
    _golden_bot: DurableFakeTelegram | None = None

    @classmethod
    def open(
        cls, root: Path, now: datetime, provider: DurableFakeTelegram,
    ) -> GoldenPathTelegramAdapter:
        config = load_platform_config(root)
        adapter = cls(config)
        registry_path = root / "registry.json"
        registry = load_customer_registry(registry_path, root)
        production = WeeklyReminderProductionInput(
            config.extra, CANDIDATE, registry, registry_path,
            adapter.weekly_reminder_customers,
        )
        adapter._golden_coordinator = NutritionCoachingCoordinator(
            root, registry, registry_path=None,
            kst_date_provider=lambda: now, generation_now_provider=lambda: now,
            task26_candidate_digest=CANDIDATE,
            weekly_reminder_owner_input=production,
        )
        adapter._golden_bot = provider
        adapter._bot = provider
        adapter._task26_candidate_digest = CANDIDATE
        adapter._task26_service_revoked = False
        return adapter

    @override
    def _get_nutrition_coaching(self) -> NutritionCoachingCoordinator:
        coordinator = self._golden_coordinator
        if coordinator is None:
            raise CliError("Golden Path coordinator is unavailable")
        return coordinator

    @property
    def golden_coordinator(self) -> NutritionCoachingCoordinator:
        return self._get_nutrition_coaching()

    async def run_authorized_tick(self, now: datetime) -> SendResult:
        return await self._send_nutrition_coaching_tick_authorized(now)

    async def edit_weekly_topic59(
        self, chat_id: str, message_id: str, text: str,
    ) -> str:
        provider = self._golden_bot
        if provider is None:
            raise CliError("Golden Path provider is unavailable")
        return await provider.edit(chat_id, message_id, text)

    @override
    def generate_weekly_explanation(
        self, request: Mapping[str, JsonValue],
    ) -> Mapping[str, JsonValue]:
        _ = request
        raise OSError("network-disabled deterministic fallback")

    def close_golden_path(self) -> None:
        self.close_weekly_reminder_capabilities()
