"""Typed weekly authority fields in schedule ledger rows."""

from __future__ import annotations

import re
from collections.abc import Mapping
from datetime import date
from typing import Final, Never, TypeVar, assert_never

from .weekly_operations_schedule_host_models_r4 import (
    CustomerScheduleError,
    ScheduledDeliveryReceipt,
    TaskKind,
    WeeklyReminderReservationAuthority,
)

_VALID_DIGEST: Final = re.compile(r"[0-9a-f]{64}")
_VALID_OPAQUE: Final = re.compile(r"[A-Za-z0-9][A-Za-z0-9._:-]{0,159}")
RowValue = TypeVar("RowValue")


def weekly_authority_fields(
    authority: WeeklyReminderReservationAuthority,
) -> dict[str, str | int]:
    """Serialize immutable authority pins without changing ledger field names."""
    return {
        "weekly_authority_digest": authority.authority_digest,
        "weekly_customer_identity_digest": authority.customer_identity_digest,
        "weekly_candidate_digest": authority.candidate_digest,
        "weekly_canonical_registry_digest": authority.canonical_registry_digest,
        "weekly_canonical_binding_digest": authority.canonical_binding_digest,
        "weekly_sidecar_authority_digest": authority.sidecar_authority_digest,
        "weekly_sidecar_history_digest": authority.sidecar_history_digest,
        "weekly_ledger_authority_digest": authority.ledger_authority_digest,
        "weekly_owner_digest": authority.owner_digest,
        "weekly_consent_digest": authority.consent_digest,
        "weekly_feature_epoch": authority.feature_epoch,
        "weekly_route_digest": authority.route_digest,
        "weekly_canonical_sequence": authority.canonical_sequence,
        "weekly_canonical_digest": authority.canonical_digest,
    }


def _digest(row: Mapping[str, RowValue], name: str, label: str) -> str:
    value = row.get(name)
    if not isinstance(value, str) or _VALID_DIGEST.fullmatch(value) is None:
        raise CustomerScheduleError(f"{label} digest is invalid")
    return value


def weekly_authority_from_receipt(
    row: ScheduledDeliveryReceipt,
) -> WeeklyReminderReservationAuthority | None:
    """Parse the complete weekly authority tuple from one receipt."""
    if row.weekly_authority_digest is None:
        return None
    sequence = row.weekly_canonical_sequence
    if sequence is None:
        raise CustomerScheduleError("weekly reminder canonical sequence is invalid")
    feature_epoch = row.weekly_feature_epoch
    if feature_epoch is None or _VALID_OPAQUE.fullmatch(feature_epoch) is None:
        raise CustomerScheduleError("weekly reminder authority row is malformed")
    return WeeklyReminderReservationAuthority(
        _digest(row, "weekly_authority_digest", "weekly authority"),
        _digest(row, "weekly_customer_identity_digest", "weekly customer"),
        _digest(row, "weekly_candidate_digest", "weekly candidate"),
        _digest(row, "weekly_canonical_registry_digest", "weekly registry"),
        _digest(row, "weekly_canonical_binding_digest", "weekly canonical binding"),
        _digest(row, "weekly_sidecar_authority_digest", "weekly sidecar authority"),
        _digest(row, "weekly_sidecar_history_digest", "weekly sidecar history"),
        _digest(row, "weekly_ledger_authority_digest", "weekly ledger authority"),
        _digest(row, "weekly_owner_digest", "weekly owner"),
        _digest(row, "weekly_consent_digest", "weekly consent"),
        feature_epoch,
        _digest(row, "weekly_route_digest", "weekly route"),
        sequence,
        _digest(row, "weekly_canonical_digest", "weekly canonical"),
    )


def _task_kind(value: str) -> TaskKind:
    match value:
        case "daily":
            return "daily"
        case "weekly":
            return "weekly"
        case "monthly":
            return "monthly"
        case "reminder":
            return "reminder"
        case "cutoff":
            return "cutoff"
        case _ as unreachable:
            assert_never(_invalid_task_kind(unreachable))


def _invalid_task_kind(value: str) -> Never:
    raise CustomerScheduleError(f"scheduled-delivery task kind is invalid: {value}")


def receipt_from_row(
    row: Mapping[str, RowValue],
    *,
    provider_authority: bool = False,
) -> ScheduledDeliveryReceipt:
    """Build the bounded receipt view from one validated ledger row."""
    text_fields = {
        name: value if isinstance(value := row.get(name), str) else None
        for name in (
            "weekly_authority_digest",
            "weekly_customer_identity_digest",
            "weekly_candidate_digest",
            "weekly_canonical_registry_digest",
            "weekly_canonical_binding_digest",
            "weekly_sidecar_authority_digest",
            "weekly_sidecar_history_digest",
            "weekly_ledger_authority_digest",
            "weekly_owner_digest",
            "weekly_consent_digest",
            "weekly_feature_epoch",
            "weekly_route_digest",
            "weekly_canonical_digest",
            "provider_receipt",
            "message_id",
            "reason",
            "legacy_claim_digest",
        )
    }
    sequence = row.get("weekly_canonical_sequence")
    return ScheduledDeliveryReceipt(
        reservation_id=str(row["reservation_id"]),
        schedule_key=str(row["schedule_key"]),
        customer_key=str(row["customer_key"]),
        kind=_task_kind(str(row["task_kind"])),
        kst_day=date.fromisoformat(str(row["kst_day"])),
        state=str(row["state"]),
        body_digest=str(row["body_digest"]),
        template_digest=str(row["template_digest"]),
        destination_digest=str(row["destination_digest"]),
        registry_digest=str(row["registry_digest"]),
        config_digest=str(row["config_digest"]),
        weekly_authority_digest=text_fields["weekly_authority_digest"],
        weekly_customer_identity_digest=text_fields["weekly_customer_identity_digest"],
        weekly_candidate_digest=text_fields["weekly_candidate_digest"],
        weekly_canonical_registry_digest=text_fields["weekly_canonical_registry_digest"],
        weekly_canonical_binding_digest=text_fields["weekly_canonical_binding_digest"],
        weekly_sidecar_authority_digest=text_fields["weekly_sidecar_authority_digest"],
        weekly_sidecar_history_digest=text_fields["weekly_sidecar_history_digest"],
        weekly_ledger_authority_digest=text_fields["weekly_ledger_authority_digest"],
        weekly_owner_digest=text_fields["weekly_owner_digest"],
        weekly_consent_digest=text_fields["weekly_consent_digest"],
        weekly_feature_epoch=text_fields["weekly_feature_epoch"],
        weekly_route_digest=text_fields["weekly_route_digest"],
        weekly_canonical_sequence=sequence if type(sequence) is int else None,
        weekly_canonical_digest=text_fields["weekly_canonical_digest"],
        provider_receipt=text_fields["provider_receipt"],
        message_id=text_fields["message_id"],
        reason=text_fields["reason"],
        legacy_claim_digest=text_fields["legacy_claim_digest"],
        append_sequence=int(str(row["append_sequence"])),
        provider_authority=provider_authority,
    )
