# utils/order_datetime.py

from __future__ import annotations

from datetime import datetime, timezone
from typing import Any, Optional
from zoneinfo import ZoneInfo


TEHRAN_TZ = ZoneInfo("Asia/Tehran")


def now_tehran() -> datetime:
    return datetime.now(
        TEHRAN_TZ
    )


def now_tehran_text(
    *,
    with_seconds: bool = True,
) -> str:
    fmt = (
        "%Y/%m/%d - %H:%M:%S"
        if with_seconds
        else "%Y/%m/%d - %H:%M"
    )

    return now_tehran().strftime(
        fmt
    )


def parse_order_datetime(
    value: Any,
) -> Optional[datetime]:
    if value is None:
        return None

    if isinstance(
        value,
        datetime,
    ):
        dt = value

    else:
        raw = str(
            value
        ).strip()

        if not raw:
            return None

        normalized = (
            raw
            .replace(
                "Z",
                "+00:00",
            )
        )

        dt = None

        try:
            dt = datetime.fromisoformat(
                normalized
            )

        except ValueError:
            pass

        if dt is None:
            for fmt in (
                "%Y-%m-%d %H:%M:%S",
                "%Y-%m-%d %H:%M:%S.%f",
                "%Y/%m/%d %H:%M:%S",
            ):
                try:
                    dt = datetime.strptime(
                        raw,
                        fmt,
                    )
                    break

                except ValueError:
                    continue

        if dt is None:
            return None

    # SQLite CURRENT_TIMESTAMP is UTC and has no tzinfo.
    if dt.tzinfo is None:
        dt = dt.replace(
            tzinfo=timezone.utc
        )

    return dt.astimezone(
        TEHRAN_TZ
    )


def format_order_datetime(
    value: Any,
    *,
    fallback: str = "ثبت نشده",
    with_seconds: bool = True,
) -> str:
    dt = parse_order_datetime(
        value
    )

    if dt is None:
        return fallback

    fmt = (
        "%Y/%m/%d - %H:%M:%S"
        if with_seconds
        else "%Y/%m/%d - %H:%M"
    )

    return dt.strftime(
        fmt
    )


def order_event_time(
    order: Any,
    *fields: str,
    fallback: str = "ثبت نشده",
) -> str:
    for field in fields:
        value = None

        if isinstance(
            order,
            dict,
        ):
            value = order.get(
                field
            )

        else:
            value = getattr(
                order,
                field,
                None,
            )

        if value:
            return format_order_datetime(
                value,
                fallback=fallback,
            )

    return fallback


__all__ = [
    "TEHRAN_TZ",
    "now_tehran",
    "now_tehran_text",
    "parse_order_datetime",
    "format_order_datetime",
    "order_event_time",
]