"""Public weekly host surface inherited by the nutrition coordinator."""

from __future__ import annotations

from abc import ABC, abstractmethod
from typing import TYPE_CHECKING

from checkin_cli.customer_coaching import CustomerRegistry
from checkin_cli.weekly_operations_grounding import GroundedWeeklyReviewSource

from gateway.platforms.nutrition_weekly_host_authority import WeeklyHostAuthority
from gateway.platforms.nutrition_weekly_host_owner_runtime import WeeklyOwnerHost
from gateway.platforms.nutrition_weekly_host_source import WeeklyReviewSource
from .nutrition_weekly_owner_contract import WeeklyLifecycleResult
from .nutrition_weekly_owner_draft import WeeklyOwnerDraftRequest, WeeklyOwnerDraftResult
from .nutrition_weekly_owner_model import WeeklyExplanationModel
from .nutrition_weekly_owner_storage import WeeklyOwnerStorageAuthority
from .nutrition_weekly_reminder_authority import WeeklyReminderAuthorityOwner

if TYPE_CHECKING:
    from .nutrition_coaching import DraftAction, IncomingAddress


class WeeklyCoordinatorHost(ABC):
    """Expose weekly operations while focused host objects own their behavior."""

    _weekly_host_authority: WeeklyHostAuthority
    _weekly_owner_host: WeeklyOwnerHost

    @property
    @abstractmethod
    def registry(self) -> CustomerRegistry: ...

    def weekly_authority_host(self) -> WeeklyHostAuthority:
        return self._weekly_host_authority

    def weekly_owner_host(self) -> WeeklyOwnerHost:
        return self._weekly_owner_host

    @property
    def weekly_reminder_authority_owner(self) -> WeeklyReminderAuthorityOwner:
        return self.weekly_authority_host().reminder_owner(self.registry)

    def create_weekly_review_draft(
        self,
        customer_key: str,
        owner: IncomingAddress,
        source: WeeklyReviewSource,
    ) -> DraftAction:
        return self.weekly_owner_host().create_review_draft(customer_key, owner, source)

    def weekly_owner_key(self) -> tuple[str, str, str]:
        return self.weekly_owner_host().owner_key()

    def weekly_owner_storage_authority(self) -> WeeklyOwnerStorageAuthority:
        return self.weekly_authority_host().storage()

    def persist_grounded_weekly_review(
        self,
        customer_key: str,
        owner_key: tuple[str, str, str],
        source: GroundedWeeklyReviewSource,
    ) -> WeeklyLifecycleResult:
        return self.weekly_owner_host().persist_review(customer_key, owner_key, source)

    def grounded_weekly_review_result(
        self, draft_id: str, owner_key: tuple[str, str, str]
    ) -> WeeklyLifecycleResult:
        return self.weekly_owner_host().review_result(draft_id, owner_key)

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