"""Freshness SLA checker for the gharchive sample pipeline.

Reads the latest partition of the `events` Iceberg table; computes
`now - max(created_at)`; fails the check if it exceeds the configured
SLA (default 90 minutes — gharchive publishes hourly).

Exit codes:
  0  FRESHNESS OK
  1  FRESHNESS BREACH
  2  FRESHNESS UNKNOWN (empty table or duckdb unavailable)
"""

from __future__ import annotations

import argparse
import sys
from datetime import datetime, timedelta, timezone

try:
    import duckdb
except ImportError:
    print("freshness.py requires duckdb; pip install duckdb", file=sys.stderr)
    sys.exit(2)

DEFAULT_SLA_MIN = 90
DEFAULT_TABLE = "events"
DEFAULT_DB = "./warehouse.duckdb"


def latest_event_time(db: str, table: str) -> datetime | None:
    """Return the maximum created_at from *table* in *db*, or None if empty."""
    con = duckdb.connect(db, read_only=True)
    row = con.execute(f"SELECT MAX(created_at) FROM {table}").fetchone()
    con.close()
    if not row or row[0] is None:
        return None
    ts = row[0]
    return ts if isinstance(ts, datetime) else datetime.fromisoformat(str(ts))


def check(
    db: str = DEFAULT_DB,
    table: str = DEFAULT_TABLE,
    sla_minutes: int = DEFAULT_SLA_MIN,
) -> int:
    """Run the freshness check and return an exit code (0/1/2)."""
    latest = latest_event_time(db, table)
    if latest is None:
        print(f"FRESHNESS UNKNOWN: {table} is empty.")
        return 2
    age = datetime.now(timezone.utc) - latest.replace(tzinfo=timezone.utc)
    sla = timedelta(minutes=sla_minutes)
    msg = f"latest={latest.isoformat()} age={age} sla={sla}"
    if age > sla:
        print(f"FRESHNESS BREACH: {msg}")
        return 1
    print(f"FRESHNESS OK: {msg}")
    return 0


def main() -> None:
    p = argparse.ArgumentParser(description="Check freshness SLA for an events table.")
    p.add_argument("--db", default=DEFAULT_DB, help="DuckDB database file path")
    p.add_argument("--table", default=DEFAULT_TABLE, help="Table name to check")
    p.add_argument("--sla-minutes", type=int, default=DEFAULT_SLA_MIN,
                   help="Maximum allowed age in minutes before SLA breach")
    args = p.parse_args()
    sys.exit(check(args.db, args.table, args.sla_minutes))


if __name__ == "__main__":
    main()
