"""Typed real-store coordinator for disposable inherited tick handling."""

from __future__ import annotations

from datetime import date, datetime
from pathlib import Path
from typing import final

from checkin_cli.customer_coaching import CustomerRegistry
from checkin_cli.customer_schedule import CustomerScheduleTask
from checkin_cli.weekly_operations_grounding import GroundedWeeklyReviewSource
from gateway.config import PlatformConfig
from gateway.platforms.nutrition_weekly_owner_contract import WeeklyLifecycleResult
from gateway.platforms.nutrition_weekly_owner_draft import WeeklyOwnerDraftService
from gateway.platforms.nutrition_weekly_owner_model import WeeklyExplanationModel
from gateway.platforms.nutrition_weekly_owner_request import (
    WeeklyOwnerDraftRequest,
    WeeklyOwnerDraftResult,
)
from gateway.platforms.nutrition_weekly_owner_storage import (
    WeeklyOwnerStorageAuthority,
    bind_weekly_owner_storage,
)
from gateway.platforms.nutrition_weekly_reminder_authority import (
    WeeklyReminderAuthorityOwner,
)
from scripts.nutricoach_v140_authority_fixture import (

    WeeklyAuthorityFixture,
    create_weekly_authority,
)


@final
class DisposableWeeklyCoordinator:
    """Supply real reminder/sidecar authorities to the production dispatcher."""

    def __init__(self, fixture: WeeklyAuthorityFixture, root: Path) -> None:
        self.fixture = fixture
        self.profile_root = root
        self.registry: CustomerRegistry = fixture.registry
        self._storage = bind_weekly_owner_storage(root / "data/owner-actions")

    def refresh_live_registry(self) -> bool:
        return True

    @property
    def weekly_reminder_authority_owner(self) -> WeeklyReminderAuthorityOwner:
        self.fixture.owner.verify_registry(self.registry)
        return self.fixture.owner

    def weekly_owner_key(self) -> tuple[str, str, str]:
        owner = self.registry.owner
        return owner.user_id, owner.chat_id, owner.topic_id

    def weekly_owner_storage_authority(self) -> WeeklyOwnerStorageAuthority:
        return self._storage

    def persist_grounded_weekly_review(
        self,
        customer_key: str,
        owner_key: tuple[str, str, str],
        source: GroundedWeeklyReviewSource,
    ) -> WeeklyLifecycleResult:
        if (
            customer_key != self.fixture.runtime.spec.customer_key
            or owner_key != self.weekly_owner_key()
            or not source.verify()
        ):
            return WeeklyLifecycleResult(False, error="invalid_weekly_source")
        return WeeklyLifecycleResult(True, "weekly-disposable", source.render_customer_body())

    def grounded_weekly_review_result(
        self, draft_id: str, owner_key: tuple[str, str, str],
    ) -> WeeklyLifecycleResult:
        if draft_id == "weekly-disposable" and owner_key == self.weekly_owner_key():
            return WeeklyLifecycleResult(True, draft_id, "weekly")
        return WeeklyLifecycleResult(False, error="missing")

    def create_grounded_weekly_owner_draft(
        self, request: WeeklyOwnerDraftRequest, model: WeeklyExplanationModel,
    ) -> WeeklyOwnerDraftResult:
        return WeeklyOwnerDraftService(self, model).create(request)


def create_tick_fixture(
    root: Path,
) -> tuple[
    WeeklyAuthorityFixture,
    DisposableWeeklyCoordinator,
    PlatformConfig,
    CustomerScheduleTask,
    CustomerScheduleTask,
]:
    """Build one reminder task and one cutoff task for Tuesday KST."""
    fixture = create_weekly_authority(root)
    coordinator = DisposableWeeklyCoordinator(fixture, root)
    config = PlatformConfig(enabled=True, token="disabled", extra=fixture.extra)
    day = date(2026, 8, 18)
    reminder = CustomerScheduleTask(fixture.runtime.spec.customer_key, "reminder", day)
    cutoff = CustomerScheduleTask(fixture.runtime.spec.customer_key, "cutoff", day)
    return fixture, coordinator, config, reminder, cutoff


def reminder_time() -> datetime:
    return datetime.fromisoformat("2026-08-18T20:00:00+09:00")


def cutoff_time() -> datetime:
    return datetime.fromisoformat("2026-08-18T23:00:00+09:00")
