# time_utils.py
from __future__ import annotations
from datetime import datetime, timezone
from zoneinfo import ZoneInfo

IST = ZoneInfo("Asia/Kolkata")

# ---- Core getters ----
def utc_now() -> datetime:
    """Timezone-aware UTC 'now'."""
    return datetime.now(timezone.utc)

def ist_now() -> datetime:
    return utc_now().astimezone(IST)

# ---- Converters ----
def ensure_aware(dt: datetime | None) -> datetime | None:
    if dt is None:
        return None
    if dt.tzinfo is None:
        # Treat naive as UTC (common in legacy code)
        dt = dt.replace(tzinfo=timezone.utc)
    return dt

def to_utc(dt: datetime | None) -> datetime | None:
    dt = ensure_aware(dt)
    return None if dt is None else dt.astimezone(timezone.utc)

def to_ist(dt: datetime | None) -> datetime | None:
    dt = ensure_aware(dt)
    return None if dt is None else dt.astimezone(IST)

# ---- Formatting / parsing ----
def iso_utc(dt: datetime | None) -> str | None:
    dt = to_utc(dt)
    return None if dt is None else dt.isoformat().replace("+00:00", "Z")

def iso_ist(dt: datetime | None) -> str | None:
    dt = to_ist(dt)
    return None if dt is None else dt.isoformat()  # includes +05:30

def fmt_ist(dt: datetime | None, fmt: str = "%d-%b-%Y %I:%M %p") -> str:
    dt = to_ist(dt)
    return "" if dt is None else dt.strftime(fmt)