#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
build_pad_data.py — 基本季語700 を Model B 用データに整形
------------------------------------------------------------------------
入力 : data/kigo_basic.json（w,id,season,part,cat,yomi,desc）
出力 : pad-data.js（window.PAD = {cats, seasonColor, rows}）
        rows[分類index] = その分類の季語を「年順」に並べた配列
        各要素: {w,y,d,season,part,frac}  frac=一年のどこか(0..1)

Model B: ↑↓=分類(7) / ←→=その分類の季語を春→冬に歩く。
frac は曼荼羅アートの角度（立春=真上）に使う。
"""
import re, json, os
ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
CATS = ["時候", "天文", "地理", "生活", "行事", "動物", "植物"]
SEASON_BASE = {"春": 0.00, "夏": 0.25, "秋": 0.50, "冬": 0.75, "新年": 0.98}
PART_OFF = {"初": 0.05, "仲": 0.11, "晩": 0.17, "三": 0.11, "新": 0.00, "暮": 0.22}
SEASON_COLOR = {"春": [236,150,175], "夏": [110,190,205], "秋": [222,148,70], "冬": [130,140,170], "新年": [200,175,120]}
SEASON_ORDER = {"春":0,"夏":1,"秋":2,"冬":3,"新年":4}

def base_frac(season, part):
    off = PART_OFF.get((part or "")[:1], 0.09)
    return (SEASON_BASE.get(season, 0.0) + off) % 1.0

def main():
    data = json.load(open(os.path.join(ROOT, "data", "kigo_basic.json"), encoding="utf-8"))
    rows = [[] for _ in CATS]
    # 分類ごとに集める
    for k in data:
        if k["cat"] not in CATS:
            continue
        rows[CATS.index(k["cat"])].append(k)
    out_rows = []
    for ci, lst in enumerate(rows):
        # (季節順, part, 元順) でソート → グループ内で少しずつ frac をずらす
        lst.sort(key=lambda k: (SEASON_ORDER.get(k["season"],9), base_frac(k["season"], k["part"])))
        # グループ（同 season+part）ごとに frac を分散
        groups = {}
        for k in lst:
            groups.setdefault((k["season"], k["part"]), []).append(k)
        items = []
        for (season, part), g in groups.items():
            bf = base_frac(season, part)
            n = len(g)
            for j, k in enumerate(g):
                frac = (bf + (j - (n-1)/2) * 0.004) % 1.0
                items.append({"w": k["w"], "y": k.get("yomi",""), "d": k.get("desc",""),
                              "season": season, "part": part, "frac": round(frac, 4)})
        items.sort(key=lambda x: x["frac"])
        out_rows.append(items)

    pad = {"cats": CATS, "seasonColor": SEASON_COLOR, "rows": out_rows}
    p = os.path.join(ROOT, "pad-data.js")
    with open(p, "w", encoding="utf-8") as f:
        f.write("// AUTOGENERATED by tools/build_pad_data.py from data/kigo_basic.json\n")
        f.write("window.PAD = ")
        f.write(json.dumps(pad, ensure_ascii=False, separators=(",", ":")))
        f.write(";\n")
    print(f"wrote {p}")
    print("各分類の語数:", {CATS[i]: len(out_rows[i]) for i in range(7)})
    print("合計:", sum(len(r) for r in out_rows))

if __name__ == "__main__":
    main()
