"""Deterministic weekly reminder review correlation."""

from __future__ import annotations

import hashlib
import json
from datetime import datetime
from typing import Final

from .weekly_operations_schedule_host_models_r4 import (
    CustomerScheduleError,
    NonResponseReviewCandidate,
    ScheduledDeliveryReceipt,
)

_JSON_SEPARATORS: Final = (",", ":")


def non_response_review_candidate(
    reminder: ScheduledDeliveryReceipt,
    *,
    response_window_ends_at: datetime,
    now: datetime,
    checkin_received_at: datetime | None = None,
) -> NonResponseReviewCandidate | None:
    """Return one deterministic review signal after proven reminder delivery."""
    if reminder.kind != "reminder" or reminder.state != "sent_audited":
        return None
    if (
        response_window_ends_at.tzinfo is None
        or now.tzinfo is None
        or (checkin_received_at is not None and checkin_received_at.tzinfo is None)
    ):
        raise CustomerScheduleError("review candidate timestamps must be timezone-aware")
    if now < response_window_ends_at:
        return None
    if checkin_received_at is not None and checkin_received_at <= now:
        return None
    payload = {
        "reminder_reservation": reminder.reservation_id,
        "response_window_ends_at": response_window_ends_at.isoformat(),
    }
    canonical = json.dumps(
        payload,
        ensure_ascii=False,
        sort_keys=True,
        separators=_JSON_SEPARATORS,
        allow_nan=False,
    )
    return NonResponseReviewCandidate(
        correlation_id=hashlib.sha256(canonical.encode("utf-8")).hexdigest(),
        customer_key=reminder.customer_key,
        missing_window=reminder.kst_day,
        reminder_reservation_id=reminder.reservation_id,
        response_window_ends_at=response_window_ends_at,
    )
