#!/usr/bin/env python3
"""Read EtherGold fireworks-request.json (shared with bridge fireworks_ipc.py)."""

from __future__ import annotations

import json
import os
from datetime import datetime, timezone
from typing import Any

FIREWORKS_REQUEST_NAME = "fireworks-request.json"
DEFAULT_ETHERGOLD_ROOT = "/home/topbox/EtherGold"
DEFAULT_WINNER_DURATION_SEC = 60.0
DEFAULT_BANK_DURATION_SEC = 30.0


def resolve_ethergold_root() -> str:
    explicit = os.environ.get("ETHERGOLD_ROOT", "").strip()
    if explicit:
        return explicit
    base = os.path.dirname(os.path.abspath(__file__))
    sibling = os.path.join(os.path.dirname(base), "EtherGold")
    if os.path.isdir(sibling):
        return sibling
    return DEFAULT_ETHERGOLD_ROOT


def resolve_fireworks_request_path() -> str:
    explicit = os.environ.get("ETHERGOLD_FIREWORKS_REQUEST_PATH", "").strip()
    if explicit:
        return explicit
    return os.path.join(resolve_ethergold_root(), FIREWORKS_REQUEST_NAME)


def fireworks_url_from_progressives_source(source: str) -> str:
    """Derive the OHD fireworks endpoint from its progressives.csv URL."""
    clean = str(source or "").strip()
    if clean.endswith("progressives.csv"):
        return clean[: -len("progressives.csv")] + FIREWORKS_REQUEST_NAME
    return clean.rstrip("/") + "/" + FIREWORKS_REQUEST_NAME


def read_fireworks_request(path: str | None = None) -> dict[str, Any] | None:
    target = path or resolve_fireworks_request_path()
    if not os.path.isfile(target):
        return None
    try:
        with open(target, encoding="utf-8") as handle:
            payload = json.load(handle)
        if isinstance(payload, dict):
            return payload
    except (OSError, ValueError, json.JSONDecodeError):
        pass
    return None


def format_progwin_display(
    cents: int | float | None,
    *,
    dollars: float | None = None,
) -> str:
    """Display string for jackpot overlay (e.g. $5,001.10)."""
    if dollars is not None:
        try:
            return f"${float(dollars):,.2f}"
        except (TypeError, ValueError):
            pass
    if cents is None:
        return ""
    try:
        c = int(cents)
    except (TypeError, ValueError):
        return ""
    return f"${c // 100:,}.{c % 100:02d}"


def fireworks_request_is_fresh(payload: dict[str, Any] | None, *, max_age_sec: float = 15.0) -> bool:
    if not payload:
        return False
    updated = payload.get("updated_utc")
    if not updated:
        return True
    try:
        text = str(updated).replace("Z", "+00:00")
        dt = datetime.fromisoformat(text)
        if dt.tzinfo is None:
            dt = dt.replace(tzinfo=timezone.utc)
        age = (datetime.now(timezone.utc) - dt).total_seconds()
        return age <= max_age_sec
    except (TypeError, ValueError):
        return True


def clear_fireworks_request(path: str | None = None) -> None:
    target = path or resolve_fireworks_request_path()
    try:
        os.remove(target)
    except FileNotFoundError:
        pass
    except OSError:
        pass


def is_local_jackpot_winner(
    payload: dict[str, Any],
    *,
    local_wire_tid: str = "",
) -> bool:
    """True when this Topbox won the progressive (bridge sets is_winner or TID match)."""
    explicit = payload.get("is_winner")
    if explicit is True:
        return True
    if explicit is False:
        return False
    winner = str(payload.get("winner_tid", "")).strip().upper()
    local = (local_wire_tid or str(payload.get("local_wire_tid", ""))).strip().upper()
    return bool(winner and local and winner == local)


def duration_from_request(
    payload: dict[str, Any],
    *,
    local_wire_tid: str = "",
    winner_duration_sec: float = DEFAULT_WINNER_DURATION_SEC,
    bank_duration_sec: float = DEFAULT_BANK_DURATION_SEC,
) -> float:
    if "duration_sec" in payload:
        try:
            return max(1.0, float(payload["duration_sec"]))
        except (TypeError, ValueError):
            pass
    winner = str(payload.get("winner_tid", "")).strip().upper()
    local = (local_wire_tid or str(payload.get("local_wire_tid", ""))).strip().upper()
    if winner and local and winner == local:
        return max(1.0, float(winner_duration_sec))
    return max(1.0, float(bank_duration_sec))
