# -*- coding: utf-8 -*-
"""O2 (umaren) raw dump -> o2_raw_all.txt. Same format as dump_o1_raw_all.py."""
from __future__ import annotations

import platform
import sys
import time

FROM_TO = "20200101000000-20261231000000"
OPTION = 4
BUFSIZE = 300000
OUT = "o2_raw_all.txt"
PROGIDS = ("JVDTLab.JVLink", "JVDTLabLib.JVLink")


def main() -> None:
    if platform.architecture()[0] != "32bit":
        sys.exit("32bit Python required")
    import win32com.client as win32

    jv = None
    for p in PROGIDS:
        try:
            jv = win32.Dispatch(p)
            break
        except Exception:
            pass
    if jv is None:
        sys.exit("JV-Link COM failed")
    if jv.JVInit("UNKNOWN") != 0:
        sys.exit("JVInit failed")

    r = jv.JVOpen("RACE", FROM_TO, OPTION, 0, 0, "")
    if r[0] < 0 or r[1] == 0:
        jv.JVClose()
        sys.exit(f"JVOpen failed rc={r[0]} read={r[1]}")
    while r[2] > 0:
        st = jv.JVStatus()
        if st < 0 or st >= r[2]:
            break
        time.sleep(1)

    n = 0
    lens: dict[int, int] = {}
    with open(OUT, "w", encoding="utf-8") as f:
        f.write(f"FROM_TO={FROM_TO}\n\n")
        while True:
            rr = jv.JVRead(" " * BUFSIZE, BUFSIZE, "")
            rc, data = rr[0], rr[1]
            if rc == 0:
                break
            if rc in (-1, -3):
                if rc == -3:
                    time.sleep(1)
                continue
            if rc < 0:
                break
            if len(data) < 2 or data[:2] != "O2":
                continue
            n += 1
            lens[len(data)] = lens.get(len(data), 0) + 1
            key = data[11:27] if len(data) >= 27 else "?"
            f.write("=" * 72 + "\n")
            f.write(f"#{n} key={key} len={len(data)} kubun={data[2:3]!r}\n")
            f.write(data)
            f.write("\n")

    jv.JVClose()
    print(f"Wrote {n} O2 records -> {OUT}")
    if lens:
        top = sorted(lens.items(), key=lambda x: -x[1])[:5]
        print("length distribution (top5):", top)


if __name__ == "__main__":
    main()
