"""Service facade for owner-approved artifact finalization."""

from __future__ import annotations

from datetime import date, datetime

from checkin_cli.nutrition_onboarding_contract import OnboardingAuthority
from checkin_cli.nutrition_onboarding_finalization import finalize_onboarding
from checkin_cli.nutrition_onboarding_fs import (
    atomic_write_private_json,
    read_private_json,
)
from checkin_cli.nutrition_onboarding_models import OnboardingState
from checkin_cli.nutrition_onboarding_session import build_status


class NutritionOnboardingFinalizationMixin:
    def finalize(
        self,
        *,
        starts_on: date,
        issued_at_kst: datetime,
        privacy_consent_digest: str | None,
        feature_epoch_digest: str,
        authority: OnboardingAuthority | None = None,
    ):
        self._validate_storage()
        if self.enforce_current_authority:
            if authority is None:
                raise ValueError("current onboarding authority is required")
            self._validate_current_authority(authority)
        document = read_private_json(self.session_path)
        if document.get("state") != OnboardingState.FINALIZING.value:
            raise ValueError("owner-approved finalization is not available")
        ready = finalize_onboarding(
            profile_root=self.profile_root,
            customer_key=self.customer_key,
            onboarding_root=self.root,
            baseline_candidate_path=self.baseline_path,
            starts_on=starts_on,
            issued_at_kst=issued_at_kst,
            privacy_consent_digest=(
                privacy_consent_digest
                or str(document["privacy_consent_digest"])
            ),
            feature_epoch_digest=feature_epoch_digest,
            owner_risk_acceptance_receipts=document.get(
                "owner_risk_acceptance_receipts"
            ),
        )
        ready.update(
            schema_version="1.0",
            customer_key=self.customer_key,
            authority_digest=document["authority_digest"],
            consumed_updates=document["consumed_updates"],
        )
        atomic_write_private_json(self.ready_path, ready)
        self.session_path.unlink()
        return build_status(customer_key=self.customer_key, document=ready)
