#!/usr/bin/env python3
"""Early-win fireworks on listen-only (no inject).

Listen already sees complete UART frames (same packet_complete hook as CSV /
current-game). Phase 1/2 traps write fireworks-request.json for DyzineFrame.
That is not bus drive. Bridge still owns inject/synth; listen owns field HDMI.

Listen defaults the FIXTURE_EARLY_WIN_* flags **on** (bridge stays opt-in).
Set a flag to 0 to disable. Phase 2 cash still needs a local TID
(ETHERGOLD_LOCAL_WIRE_TID, POG_TID, or ETHERGOLD_CURRENT_GAME_TID).
"""

from __future__ import annotations

import os
from typing import Any

from early_win_phase1 import build_phase1_trap_from_env
from early_win_phase2_keno import build_phase2_keno_trap_from_env
from early_win_phase2_slots import build_phase2_slot_trap_from_env

LISTEN_EARLY_WIN_DEFAULT = "1"


def resolve_listen_local_tid() -> str | None:
    for key in (
        "ETHERGOLD_LOCAL_WIRE_TID",
        "POG_TID",
        "ETHERGOLD_CURRENT_GAME_TID",
    ):
        value = os.environ.get(key, "").strip().upper()
        if value:
            return value
    return None


def attach_early_win_listen_hook(event_log) -> dict[str, Any]:
    """Inspect listen UART frames with the same traps as the bridge."""
    local_tid = resolve_listen_local_tid()
    on_event = getattr(event_log, "emit", None)
    phase1 = build_phase1_trap_from_env(
        on_event=on_event, default=LISTEN_EARLY_WIN_DEFAULT
    )
    keno = build_phase2_keno_trap_from_env(
        on_event=on_event, default=LISTEN_EARLY_WIN_DEFAULT
    )
    slots = build_phase2_slot_trap_from_env(
        on_event=on_event, default=LISTEN_EARLY_WIN_DEFAULT
    )
    status = {
        "phase1": phase1 is not None,
        "keno": keno is not None,
        "slots": slots is not None,
        "local_tid": local_tid,
    }
    if phase1 is None and keno is None and slots is None:
        if on_event is not None:
            on_event("early_win_listen_disabled", **status)
        return status

    def _on_packet_complete_early_win(
        meta,
        pkt: bytes,
        packets_in_window: int,
        *,
        uart_first_byte: int | None = None,
        window_us: float | None = None,
        byte_span_us: float | None = None,
    ) -> None:
        del meta, packets_in_window, uart_first_byte, window_us, byte_span_us
        if phase1 is not None:
            phase1.inspect(pkt, source="listen_uart", local_wire_tid=local_tid)
        if keno is not None:
            keno.inspect(pkt, source="listen_uart", local_wire_tid=local_tid)
        if slots is not None:
            slots.inspect(pkt, source="listen_uart", local_wire_tid=local_tid)

    event_log.add_packet_complete_hook(_on_packet_complete_early_win)
    if on_event is not None:
        on_event("early_win_listen_enabled", **status)
    return status
