#!/usr/bin/env python3
"""Extract first complete Touch 6 0x20 (48 B, game 9107) from packets.raw → hex template."""

from __future__ import annotations

import argparse
import re
import sys
from pathlib import Path

from pog422_fixture_core import parse_packet_meta, pog422_frame_checksum_ok

_PAT = re.compile(
    r"05,20,01,[0-9A-Fa-f]{2},[0-9A-Fa-f]{2},07,91,[0-9A-Fa-f,]{90,}0[Dd]",
    re.I,
)


def main() -> int:
    ap = argparse.ArgumentParser(description=__doc__)
    ap.add_argument("packets_raw", type=Path)
    ap.add_argument(
        "-o",
        "--output",
        type=Path,
        default=Path("lab_gameplay_templates/touch6_wager.hex"),
    )
    args = ap.parse_args()
    text = args.packets_raw.read_text(encoding="utf-8", errors="ignore")
    for m in _PAT.finditer(text.replace(" ", "")):
        s = m.group(0)
        parts = s.split(",")
        if len(parts) != 48:
            continue
        frame = bytes(int(x, 16) for x in parts)
        if not pog422_frame_checksum_ok(frame):
            continue
        meta = parse_packet_meta(frame)
        if meta.game_id_hex != "9107":
            continue
        args.output.parent.mkdir(parents=True, exist_ok=True)
        header = (
            f"# Extracted from {args.packets_raw.as_posix()}\n"
            f"# tid={meta.tid_hex} seq={meta.play_sequence} game={meta.game_id_hex} "
            f"byte8=0x{frame[8]:02X}\n"
            f"# Synth rewrites TID + seq + CRC only.\n"
            f"#\n"
        )
        args.output.write_text(header + s.upper() + "\n", encoding="utf-8")
        print(f"wrote {args.output} tid={meta.tid_hex} seq={meta.play_sequence}")
        return 0
    print("FATAL: no checksum-OK Touch6 0x20/9107/48B found", file=sys.stderr)
    return 1


if __name__ == "__main__":
    raise SystemExit(main())
