"""Authority-bound factory and public surface for weekly owner facts."""

from __future__ import annotations

from decimal import Decimal

from .weekly_operations_grounding_types import (
    FALLBACK_TOKEN,
    LOCK_TOKEN,
    GroundedPriorWeekComparison,
    GroundedWeeklyFacts,
    WeekStatus,
    WeeklyAction,
    WeeklyDecision,
    WeeklyDecisionOption,
    WeeklyGroundingBindings,
    WeeklyGroundingError,
    grounded_facts_digest,
)
from .weekly_operations_owner_binding import BoundWeeklySummaryForOwnerDraft

def lock_weekly_facts(bound: BoundWeeklySummaryForOwnerDraft, bindings: WeeklyGroundingBindings) -> GroundedWeeklyFacts:
    if not bound.verify():
        raise WeeklyGroundingError("bound summary")
    summary = bound.summary
    prior = summary.prior_week_comparison
    comparison = None if prior is None else GroundedPriorWeekComparison(
        prior.submitted_count_delta, prior.late_count_delta, prior.missed_count_delta,
        prior.completed_days_delta, Decimal(str(prior.adherence_percent_delta)),
    )
    status = WeekStatus.CLOSED if summary.submitted_count + summary.late_count + summary.missed_count == 7 else WeekStatus.INCOMPLETE
    values = (
        summary.starts_on, summary.ends_on, summary.submitted_count, summary.late_count,
        summary.missed_count, summary.completed_days, summary.calendar_days,
        Decimal(str(summary.adherence_percent)), summary.weight_trend,
        summary.reminder_sent_count, summary.reminder_incident_count, comparison, status,
        tuple(WeeklyDecisionOption), WeeklyDecision.OWNER_REVIEW_REQUIRED,
        tuple(WeeklyAction), bound.summary_digest, bound.authority_digest, *bindings.values(),
    )
    provisional = object.__new__(GroundedWeeklyFacts)
    for name, value in zip(GroundedWeeklyFacts.__slots__, (*values, ""), strict=True):
        object.__setattr__(provisional, name, value)
    digest = grounded_facts_digest(provisional)
    return GroundedWeeklyFacts(
        starts_on=summary.starts_on, ends_on=summary.ends_on,
        submitted_count=summary.submitted_count, late_count=summary.late_count,
        missed_count=summary.missed_count, completed_days=summary.completed_days,
        calendar_days=summary.calendar_days,
        adherence_percent=Decimal(str(summary.adherence_percent)),
        weight_trend=summary.weight_trend,
        reminder_sent_count=summary.reminder_sent_count,
        reminder_incident_count=summary.reminder_incident_count,
        prior_week_comparison=comparison, week_status=status,
        decision_options=tuple(WeeklyDecisionOption),
        decision=WeeklyDecision.OWNER_REVIEW_REQUIRED, actions=tuple(WeeklyAction),
        source_aggregate_digest=bound.summary_digest,
        bound_summary_authority_digest=bound.authority_digest,
        candidate_digest=bindings.candidate_digest, config_digest=bindings.config_digest,
        customer_authority_digest=bindings.customer_authority_digest,
        owner_route_digest=bindings.owner_route_digest,
        consent_digest=bindings.consent_digest, grounding_digest=digest,
    )


from .weekly_operations_grounded_source import (
    GroundedWeeklyReviewSource,
    build_grounded_weekly_source,
    deterministic_weekly_fallback,
)

__all__ = (
    "FALLBACK_TOKEN", "LOCK_TOKEN", "GroundedWeeklyFacts",
    "GroundedWeeklyReviewSource", "WeekStatus", "WeeklyAction",
    "WeeklyDecision", "WeeklyDecisionOption", "WeeklyGroundingBindings",
    "WeeklyGroundingError", "build_grounded_weekly_source",
    "deterministic_weekly_fallback", "lock_weekly_facts",
)
