"""Date/time and qualifier text formatting, plus the Jinja filters built on them."""
import re
from datetime import datetime

from nexora.core import app


def format_qualifier_parts(value):
    """Split a qualifier datetime/place string into human pieces.

    Inputs like '2026-09-28T17:46' (date) and a separate TBD/venue text are
    rendered as date '28 September 2026', time '05:46 PM'.
    """
    dt = parse_dt(value)
    if dt:
        date_str = dt.strftime("%d %B %Y")
        has_time = bool(re.search(r"[T\s]\d{1,2}:\d{2}", str(value).strip()))
        time_str = dt.strftime("%I:%M %p") if has_time else ""
        return {"date": date_str, "time": time_str, "venue": "TBD", "city": ""}
    text = str(value or "").strip()
    return {"date": text, "time": "", "venue": "TBD", "city": ""}


def split_venue_location(location_text):
    """Split 'CNERGYICO Arena, Karachi, Pakistan' into venue + city."""
    text = (location_text or "").strip()
    if not text or text.upper() in {"TBD", ""}:
        return "TBD", ""
    parts = [p.strip() for p in text.split(",") if p.strip()]
    if len(parts) >= 2:
        return parts[0], ", ".join(parts[1:])
    return text, ""


# â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€
# Context
# â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€
def parse_dt(value):
    if not value:
        return None
    text = str(value).strip()
    for fmt in ("%Y-%m-%dT%H:%M", "%Y-%m-%dT%H:%M:%S", "%Y-%m-%d %H:%M:%S", "%Y-%m-%d %H:%M", "%Y-%m-%d"):
        try:
            return datetime.strptime(text, fmt)
        except ValueError:
            continue
    return None


@app.template_global("now")
def now_global():
    return datetime.now()


@app.template_filter("pretty_dt")
def pretty_dt(value):
    """Turn 2026-10-15T18:00 into 15 Oct 2026, 06:00 PM."""
    if not value:
        return ""
    text = str(value).strip()
    for fmt in ("%Y-%m-%dT%H:%M", "%Y-%m-%dT%H:%M:%S", "%Y-%m-%d %H:%M:%S", "%Y-%m-%d"):
        try:
            return datetime.strptime(text, fmt).strftime("%d %b %Y, %I:%M %p")
        except ValueError:
            continue
    return text.replace("T", " ")


@app.template_filter("qdate")
def qdate_filter(value):
    """ISO datetime -> human date '28 September 2026'."""
    return format_qualifier_parts(value)["date"]


@app.template_filter("qtime")
def qtime_filter(value):
    """ISO datetime -> human 12-hour time '08:00 PM'."""
    return format_qualifier_parts(value)["time"]


@app.template_filter("qvenue")
def qvenue_filter(location, field="venue"):
    """Split 'CNERGYICO Arena, Karachi, Pakistan' into venue or city."""
    venue, city = split_venue_location(location)
    return city if field == "city" else venue
