"""Semantic clean-boundary validation for the live target."""

from __future__ import annotations
import json
from datetime import UTC, datetime
from pathlib import Path
from typing import cast
from scripts.nutricoach_v150_live_upgrade_common import (
    JsonValue,
    UpgradeDenied,
    list_at,
    load_object,
    object_at,
    rows_at,
    string_at,
)


def _expires(value: JsonValue | None) -> datetime:
    parsed = datetime.fromisoformat(string_at(value, "expiry").replace("Z", "+00:00"))
    return parsed if parsed.tzinfo else parsed.replace(tzinfo=UTC)


def clean_boundary(profile: Path, now: datetime) -> dict[str, JsonValue]:
    data = profile / "data"
    bootstrap = load_object(
        data / "onboarding/telegram-customer-bootstrap-v1/ledger.json"
    )
    sessions = list_at(bootstrap.get("sessions"), "bootstrap_sessions")
    active = [
        row
        for row in sessions
        if isinstance(row, dict)
        and row.get("state") == "ACTIVE"
        and (row.get("expires_at") is None or _expires(row.get("expires_at")) > now)
    ]
    if active:
        raise UpgradeDenied("pending_onboarding")
    outbox = data / "onboarding/telegram-publication-outbox-v1"
    publications = list_at(load_object(outbox / "ledger.json").get("records"), "outbox")
    if any(
        isinstance(row, dict) and row.get("state") != "COMMITTED"
        for row in publications
    ):
        raise UpgradeDenied("pending_provider_outcome")
    emergency = list_at(
        load_object(outbox / "emergency.json").get("records"), "emergency"
    )
    if emergency:
        raise UpgradeDenied("unknown_provider_outcome")
    latest: dict[str, str] = {}
    deliveries = (data / "scheduled-deliveries.jsonl").read_text(encoding="utf-8")
    for line in deliveries.splitlines():
        row = object_at(cast(JsonValue, json.loads(line)), "delivery")
        latest[string_at(row.get("reservation_id"), "reservation")] = string_at(
            row.get("state"), "delivery_state"
        )
    if any(state != "sent_audited" for state in latest.values()):
        raise UpgradeDenied("pending_send")
    onboarding = sorted(
        (data / "customers").glob("*/nutrition-onboarding/session.json")
    )
    for path in onboarding:
        records = rows_at(load_object(path).get("sessions"), "onboarding")
        if any(
            isinstance(row, dict) and row.get("state") != "COMMITTED" for row in records
        ):
            raise UpgradeDenied("pending_onboarding")
    migrations = data / "migrations"
    for path in migrations.rglob("*.json") if migrations.is_dir() else ():
        row = load_object(path)
        if "pending" in path.name or row.get("state") in {
            "pending",
            "in_progress",
            "applying",
        }:
            raise UpgradeDenied("pending_migration")
    drafts = data / "owner-actions/draft-deliveries.json"
    if drafts.exists() and drafts.stat().st_size:
        raise UpgradeDenied("pending_owner_review")
    return {
        "emergency_empty": True,
        "expired_or_non_active_bootstrap_allowed": len(sessions),
        "onboarding_committed_files": len(onboarding),
        "publication_committed": len(publications),
        "scheduled_reservations_sent_audited": len(latest),
        "status": "CLEAN_BOUNDARY",
    }
