"""Bangladesh time formatting helpers (UTC+6, Asia/Dhaka).

Use these everywhere user-visible timestamps appear: PDFs, emails, admin notes.
All storage stays in UTC ISO strings — these helpers only format for display.
"""
from datetime import datetime, timezone, timedelta
from typing import Optional

try:
    from zoneinfo import ZoneInfo
    BD_TZ = ZoneInfo("Asia/Dhaka")
except Exception:  # pragma: no cover - fallback for systems without tzdata
    BD_TZ = timezone(timedelta(hours=6), name="BDT")


def to_bd(dt: Optional[datetime]) -> Optional[datetime]:
    """Convert a (UTC-naive or aware) datetime to Bangladesh time."""
    if dt is None:
        return None
    if dt.tzinfo is None:
        dt = dt.replace(tzinfo=timezone.utc)
    return dt.astimezone(BD_TZ)


def parse_iso(iso_str: Optional[str]) -> Optional[datetime]:
    if not iso_str:
        return None
    try:
        return datetime.fromisoformat(str(iso_str).replace("Z", "+00:00"))
    except Exception:
        return None


def fmt_bd(iso_str: Optional[str], pattern: str = "%d %b %Y · %I:%M %p") -> str:
    """Format an ISO UTC string as Bangladesh local time. Returns '—' if invalid."""
    dt = parse_iso(iso_str)
    if not dt:
        return "—"
    local = to_bd(dt)
    return f"{local.strftime(pattern)} BDT"


def now_bd_str(pattern: str = "%d %b %Y · %I:%M %p") -> str:
    """Current time in Bangladesh, formatted."""
    return f"{to_bd(datetime.now(timezone.utc)).strftime(pattern)} BDT"


def fmt_bd_long(iso_str: Optional[str]) -> str:
    """Long human format e.g. '11 May 2026, 08:42 PM BDT'."""
    return fmt_bd(iso_str, "%d %B %Y, %I:%M %p")
