"""Freshness tracking for verification timestamps."""

import logging
from datetime import datetime, timedelta, timezone
from typing import Dict, Any, Optional

from .config import get_policy
from .enums import ValidationState

log = logging.getLogger("pub-integrity")


def check_freshness(
    league: str,
    roster_verified_at: Optional[datetime],
    availability_verified_at: Optional[datetime],
    lineup_verified_at: Optional[datetime],
) -> Dict[str, Any]:
    """
    Check if verification timestamps are within acceptable freshness windows.

    Returns a dict with freshness status for each dimension.
    """
    policy = get_policy(league)
    now = datetime.now(timezone.utc)

    def age_minutes(ts: Optional[datetime]) -> Optional[float]:
        if ts is None:
            return None
        return (now - ts).total_seconds() / 60

    roster_age = age_minutes(roster_verified_at)
    avail_age = age_minutes(availability_verified_at)
    lineup_age = age_minutes(lineup_verified_at)

    return {
        "roster": {
            "verified_at": roster_verified_at.isoformat() if roster_verified_at else None,
            "age_minutes": round(roster_age, 1) if roster_age is not None else None,
            "max_age_minutes": policy.roster_freshness_max_min,
            "is_fresh": roster_age is not None and roster_age <= policy.roster_freshness_max_min,
            "is_stale": roster_age is not None and roster_age > policy.roster_freshness_max_min,
        },
        "availability": {
            "verified_at": availability_verified_at.isoformat() if availability_verified_at else None,
            "age_minutes": round(avail_age, 1) if avail_age is not None else None,
            "max_age_minutes": policy.availability_freshness_max_min,
            "is_fresh": avail_age is not None and avail_age <= policy.availability_freshness_max_min,
            "is_stale": avail_age is not None and avail_age > policy.availability_freshness_max_min,
        },
        "lineup": {
            "verified_at": lineup_verified_at.isoformat() if lineup_verified_at else None,
            "age_minutes": round(lineup_age, 1) if lineup_age is not None else None,
            "max_age_minutes": policy.lineup_freshness_max_min,
            "is_fresh": lineup_age is not None and lineup_age <= policy.lineup_freshness_max_min,
            "is_stale": lineup_age is not None and lineup_age > policy.lineup_freshness_max_min,
        },
    }


def should_suppress_for_staleness(
    league: str,
    roster_verified_at: Optional[datetime],
    availability_verified_at: Optional[datetime],
) -> bool:
    """Check if data is so stale that props should be suppressed."""
    freshness = check_freshness(league, roster_verified_at, availability_verified_at, None)

    # Suppress if availability is stale (most critical)
    if freshness["availability"]["is_stale"]:
        log.warning(f"[freshness] Availability data stale for {league} "
                    f"(age: {freshness['availability']['age_minutes']}min)")
        return True

    return False
