"""Exact request and source bindings for weekly generation rows."""

from __future__ import annotations

from checkin_cli.weekly_operations_grounding import GroundedWeeklyFacts, GroundedWeeklyReviewSource

from .nutrition_weekly_owner_ledger import (
    WeeklyGenerationLedger, WeeklyGenerationRow, WeeklyGenerationState,
    generation_base, require_exact_request_row,
)
from .nutrition_weekly_owner_request import WeeklyOwnerDraftRequest, authority_hash
from .nutrition_weekly_owner_storage import WeeklyOwnerStorageAuthority

def weekly_generation_base(request: WeeklyOwnerDraftRequest, facts: GroundedWeeklyFacts | None = None) -> WeeklyGenerationRow:
    locked = request.facts if facts is None else facts
    return _generation_base(
        request.customer_key, request.owner_key, locked,
        request.storage_binding_digest,
    )


def _generation_base(customer_key: str, owner_key: tuple[str, str, str], facts: GroundedWeeklyFacts, storage_binding_digest: str) -> WeeklyGenerationRow:
    customer = authority_hash("customer", customer_key)
    owner = authority_hash("owner", *owner_key)
    authority = authority_hash("authority", facts.grounding_digest, facts.customer_authority_digest)
    logical = authority_hash("logical", customer, facts.starts_on.isoformat(), owner, authority)
    request_base = authority_hash("request-base", logical, customer, facts.starts_on.isoformat(), owner, authority, facts.source_aggregate_digest, facts.bound_summary_authority_digest, storage_binding_digest, facts.candidate_digest, facts.config_digest, facts.consent_digest)
    return generation_base(logical, request_base, customer, facts.starts_on.isoformat(), owner, authority, facts.source_aggregate_digest, facts.bound_summary_authority_digest, facts.candidate_digest, storage_binding_digest, facts.config_digest, facts.consent_digest)


def grounded_weekly_source_is_reserved(storage: WeeklyOwnerStorageAuthority, source: GroundedWeeklyReviewSource, customer_key: str, owner_key: tuple[str, str, str]) -> bool:
    if not source.verify():
        return False
    base = _generation_base(customer_key, owner_key, source.facts, storage.binding_digest)
    latest = WeeklyGenerationLedger(storage).read_rows()
    row = next((item for item in reversed(latest) if item.logical_key == base.logical_key), None)
    if row is None:
        return False
    require_exact_request_row(base, row)
    return row.state in {WeeklyGenerationState.FINAL, WeeklyGenerationState.BOUND} and row.source_digest == source.source_digest


