"""Extrait `System.rvdata2` d'un jeu en JSON pour le seed des référentiels.

Produit `csv_data/<game>/system.json` avec la forme :
    {
      "elements":     [{"id": 1, "name": "Physique"}, ...],
      "weapon_types": [{"id": 1, "name": "Hache"}, ...],
      "armor_types":  [{"id": 1, "name": "Armure moyenne"}, ...]
    }

Les entrées vides (index 0 ou name vide) sont écartées.
Le `id` correspond à l'index rvdata (= original_id côté DB après seed).

Usage :
    py tools/extract_system.py                                 # csi-forever par défaut
    py tools/extract_system.py --game=narval-souls
"""
import json
import sys
from pathlib import Path
from rubymarshal.reader import loads

ROOT         = Path(r"c:\wamp64\www\csi-world")
DEFAULT_GAME = "csi-forever"


def decode(value):
    if hasattr(value, "text"):
        return value.text
    if isinstance(value, bytes):
        return value.decode("utf-8", errors="replace")
    return value


def names_list(arr) -> list[dict]:
    """Convertit ['', 'Feu', 'Eau', ...] en [{id:1, name:'Feu'}, {id:2, name:'Eau'}]
    (saute l'index 0 et les noms vides)."""
    out = []
    for i, raw in enumerate(arr or []):
        if i == 0:
            continue  # index 0 = padding RPG Maker
        name = (decode(raw) or "").strip()
        if not name:
            continue
        out.append({"id": i, "name": name})
    return out


def process(game: str) -> None:
    src = ROOT / "csv_data" / game / "System.rvdata2"
    dst = ROOT / "csv_data" / game / "system.json"
    if not src.exists():
        print(f"[ERROR] introuvable : {src}", file=sys.stderr)
        sys.exit(1)

    a = loads(src.read_bytes()).attributes
    payload = {
        "elements":     names_list(a.get("@elements")),
        "weapon_types": names_list(a.get("@weapon_types")),
        "armor_types":  names_list(a.get("@armor_types")),
    }

    dst.write_text(json.dumps(payload, ensure_ascii=False, indent=2), encoding="utf-8")
    print(f"OK [{game}]  élements: {len(payload['elements'])}, "
          f"wtypes: {len(payload['weapon_types'])}, "
          f"atypes: {len(payload['armor_types'])}  → {dst.relative_to(ROOT)}")


def main() -> None:
    game = DEFAULT_GAME
    for arg in sys.argv[1:]:
        if arg.startswith("--game="):
            game = arg.split("=", 1)[1].strip() or DEFAULT_GAME
        else:
            print(f"[WARN] argument ignoré : {arg}", file=sys.stderr)
    process(game)


if __name__ == "__main__":
    sys.stdout.reconfigure(encoding="utf-8")
    main()
