# -*- coding: utf-8 -*-
"""
o1_raw_index.txt（JV生）と keiba.db NL_O1 をレース単位で突き合わせ。

前提: dump_o1_raw.py 実行済み
"""
from __future__ import annotations

import re
import sqlite3
import sys

INDEX = "o1_raw_index.txt"
DB = sys.argv[1] if len(sys.argv) > 1 else r"data\keiba.db"


def _parse_line(line: str) -> tuple[str, bool] | None:
    # 2026/01/05 場05 01回01日 01R\tTrue
    m = re.match(
        r"(\d{4})/(\d{2})/(\d{2})\s+場(\d{2})\s+\d+回\d+日\s+(\d+)R\s+(True|False)",
        line.strip(),
    )
    if not m:
        return None
    y, mo, d, jyo, rn, has = m.groups()
    md = f"{mo}{d}"
    rn2 = rn.zfill(2)
    return f"{y}|{jyo}|{md}|{rn2}", has == "True"


def main() -> None:
    try:
        lines = open(INDEX, encoding="utf-8").readlines()
    except OSError:
        print(f"ERROR: {INDEX} がありません。先に dump_o1_raw.py を実行")
        sys.exit(1)

    jv: dict[str, bool] = {}
    for line in lines:
        if line.startswith("---") or "場" not in line:
            continue
        p = _parse_line(line)
        if p:
            jv[p[0]] = p[1]

    if not jv:
        print("ERROR: index からレースを読めません")
        sys.exit(1)

    conn = sqlite3.connect(DB)
    rk = "Year||'|'||JyoCD||'|'||MonthDay||'|'||RaceNum"

    db_has_row: set[str] = set()
    db_has_odds: set[str] = set()
    for row in conn.execute(
        f"SELECT {rk}, TanOdds FROM NL_O1 WHERE Year='2026' AND DataKubun IN ('4','5')"
    ):
        key, to = row
        db_has_row.add(key)
        if to is not None and str(to).strip() and float(str(to).strip() or 0) > 0:
            db_has_odds.add(key)

    conn.close()

    jv_keys = set(jv)
    jv_with = {k for k, h in jv.items() if h}

    miss_row = jv_keys - db_has_row
    jv_odds_db_empty = jv_with - db_has_odds
    db_odds_not_in_jv = db_has_odds - jv_with

    print("=== JV index vs NL_O1 ===")
    print(f"JV O1 races:        {len(jv_keys)}")
    print(f"JV with odds bytes: {len(jv_with)}")
    print(f"DB NL_O1 rows:      {len(db_has_row)} races")
    print(f"DB TanOdds>0:       {len(db_has_odds)} races")
    print("")
    print(f"JVにあるがDBにO1行なし:     {len(miss_row)}")
    print(f"JVオッズあり→DB TanOdds空:  {len(jv_odds_db_empty)}  <-- 展開バグ候補")
    print(f"DBオッズありだがJV index無:  {len(db_odds_not_in_jv)}")
    print("")

    if jv_odds_db_empty:
        print("--- 先頭10件 (JV oddsあり / DB TanOdds空) ---")
        for k in sorted(jv_odds_db_empty)[:10]:
            print(" ", k.replace("|", " "))
    print("")
    if len(jv_odds_db_empty) > 0 and len(miss_row) == 0:
        print("=> ②確定: 生データは揃い、DB展開で TanOdds が落ちている")
        print("=> jrvltsql 更新 or O1パース修正 or 別途JV生→DB投入スクリプト")


if __name__ == "__main__":
    main()
