"""Typed Topic-59 request fixture over disposable real authority."""

from __future__ import annotations

import hashlib
from dataclasses import dataclass
from datetime import date, datetime
from pathlib import Path

from gateway.platforms.nutrition_weekly_operations import Topic59PublicationRequest
from gateway.platforms.nutrition_weekly_operations_models import (
    Topic59ApprovalState,
    Topic59DayCard,
    Topic59DayState,
    Topic59DeliveryState,
    Topic59DraftState,
)
from scripts.nutricoach_v140_authority_fixture import (
    CANDIDATE,
    CUSTOMER_KEY,
    WeeklyAuthorityFixture,
    create_weekly_authority,
)


@dataclass(frozen=True, slots=True)
class DisposableSidecarRow:
    customer_identity_digest: str
    kst_day: date
    state: str
    source_event_id: str | None
    logical_key: str
    row_digest: str


@dataclass(frozen=True, slots=True)
class Topic59RequestFixture:
    authority: WeeklyAuthorityFixture

    def request(self, state: Topic59DayState) -> Topic59PublicationRequest:
        """Build one authorized privacy-safe card request."""
        runtime = self.authority.owner.tick_snapshot(
            CUSTOMER_KEY, datetime.fromisoformat("2026-08-18T23:30:00+09:00"),
        )
        identity = hashlib.sha256(
            f"nutricoach-weekly-operations-customer-identity-v1\0{CUSTOMER_KEY}".encode()
        ).hexdigest()
        event_id = None if state is Topic59DayState.MISSED else "event-late"
        row = DisposableSidecarRow(
            identity, date(2026, 8, 18), state.value, event_id,
            hashlib.sha256(f"logical-{state.value}".encode()).hexdigest(),
            hashlib.sha256(f"row-{state.value}".encode()).hexdigest(),
        )
        card = Topic59DayCard.from_sidecar(
            row, completed_field_count=5,
            draft_state=Topic59DraftState.DRAFTED,
            approval_state=Topic59ApprovalState.PENDING,
            delivery_state=Topic59DeliveryState.NOT_SENT,
            candidate_digest=CANDIDATE,
        )
        return Topic59PublicationRequest(
            card, runtime.config, runtime.receipt, runtime.runtime,
        )


def create_topic59_fixture(root: Path) -> Topic59RequestFixture:
    """Create the real authority retained by Topic-59 requests."""
    return Topic59RequestFixture(create_weekly_authority(root))
