"""Typed reminder adapter over the no-path ledger capability."""

from __future__ import annotations

from datetime import date

from .weekly_operations_schedule_host_models_r4 import (
    ScheduledDeliveryReceipt,
    WeeklyReminderReservationAuthority,
)
from .weekly_reminder_authority import BoundWeeklyReminderCustomer
from .weekly_reminder_ledger_authority import LedgerReservation, LedgerTransition


def receipts(bound: BoundWeeklyReminderCustomer) -> tuple[ScheduledDeliveryReceipt, ...]:
    return bound.ledger.receipts()


def reserve(
    bound: BoundWeeklyReminderCustomer,
    day: date,
    authority: WeeklyReminderReservationAuthority,
) -> ScheduledDeliveryReceipt:
    return bound.ledger.reserve(
        LedgerReservation(
            bound.customer_identity_digest,
            day,
            {"chat_id": bound.route.chat_id, "topic_id": bound.route.topic_id},
            bound.runtime_registry_digest,
            bound.config_digest,
            bound.authority_digest,
            bound.canonical.sequence,
            bound.canonical.digest,
            authority,
        )
    )


def _transition(
    bound: BoundWeeklyReminderCustomer,
    value: LedgerTransition,
) -> ScheduledDeliveryReceipt:
    return bound.ledger.transition(value)


def abandon(bound: BoundWeeklyReminderCustomer, receipt: ScheduledDeliveryReceipt, reason: str) -> ScheduledDeliveryReceipt:
    return _transition(bound, LedgerTransition("abandon", receipt, reason=reason))


def abandon_answered(bound: BoundWeeklyReminderCustomer, receipt: ScheduledDeliveryReceipt) -> ScheduledDeliveryReceipt:
    return _transition(bound, LedgerTransition("answered", receipt))


def mark_sending(bound: BoundWeeklyReminderCustomer, receipt: ScheduledDeliveryReceipt, authority: WeeklyReminderReservationAuthority) -> ScheduledDeliveryReceipt:
    return _transition(bound, LedgerTransition("sending", receipt, authority=authority))


def mark_known_failure(bound: BoundWeeklyReminderCustomer, receipt: ScheduledDeliveryReceipt, reason: str) -> ScheduledDeliveryReceipt:
    return _transition(bound, LedgerTransition("known_failure", receipt, reason=reason))


def mark_unknown(bound: BoundWeeklyReminderCustomer, receipt: ScheduledDeliveryReceipt, reason: str) -> ScheduledDeliveryReceipt:
    return _transition(bound, LedgerTransition("unknown", receipt, reason=reason))


def mark_delivered(bound: BoundWeeklyReminderCustomer, receipt: ScheduledDeliveryReceipt, provider_receipt: str, message_id: str) -> ScheduledDeliveryReceipt:
    return _transition(bound, LedgerTransition("delivered", receipt, provider_receipt=provider_receipt, message_id=message_id))


def mark_audited(bound: BoundWeeklyReminderCustomer, receipt: ScheduledDeliveryReceipt) -> ScheduledDeliveryReceipt:
    return _transition(bound, LedgerTransition("audited", receipt))
