#!/usr/bin/env python3
"""Export battle background tilemaps for the browser runtime."""
from __future__ import annotations

import argparse
import json
import re
from pathlib import Path

from export_map_js import parse_map


ROOT = Path(__file__).resolve().parents[1]
EXTRACT_FLD = ROOT / "extract_fld"
OUT = ROOT / "out"
BATTLE_MAP_RE = re.compile(r"^btl_([a-z])([0-9]+)$")


def js_json(data) -> str:
    return json.dumps(data, ensure_ascii=False, separators=(",", ":"))


def battle_tilesets(family: str, extract_dir: Path = EXTRACT_FLD) -> list[str]:
    first = f"map_{family}1"
    second = f"map_{family}2"
    if not (extract_dir / f"{first}.cns").exists():
        first = "map_a1"
    if not (extract_dir / f"{second}.cns").exists():
        second = first
    return [first, second]


def build_index(extract_dir: Path = EXTRACT_FLD) -> dict[str, dict]:
    backgrounds: dict[str, dict] = {}
    for src in sorted(extract_dir.glob("btl_*.cns")):
        match = BATTLE_MAP_RE.fullmatch(src.stem)
        if not match:
            continue
        family, variant = match.groups()
        info = parse_map(src, name=src.stem)
        tilesets = battle_tilesets(family, extract_dir)
        info.update(
            {
                "kind": "battle-background",
                "family": family,
                "variant": int(variant),
                "tileset": tilesets[0],
                "layerTilesets": tilesets,
                "sceneTilesets": tilesets,
                "observedSceneTilesets": tilesets,
                "sceneTilesetVariants": [tilesets],
                "tileIndexMode": "row40_zero",
                "visualMode": "layer1UnderSceneTilesets",
                "terrainBlockedTiles": [],
                "passableTiles": None,
                "transitions": [],
            }
        )
        backgrounds[src.stem] = info
    return backgrounds


def write_outputs(backgrounds: dict[str, dict], out_dir: Path = OUT) -> None:
    out_dir.mkdir(parents=True, exist_ok=True)
    (out_dir / "battle_backgrounds.json").write_text(
        json.dumps(backgrounds, ensure_ascii=False, indent=2) + "\n",
        encoding="utf-8",
    )
    (out_dir / "battle_backgrounds.js").write_text(
        "window.HWANSE_BATTLE_BACKGROUNDS = "
        + js_json(backgrounds)
        + ";\n",
        encoding="utf-8",
    )


def export_battle_backgrounds(out_dir: Path = OUT, extract_dir: Path = EXTRACT_FLD) -> dict[str, dict]:
    backgrounds = build_index(extract_dir)
    write_outputs(backgrounds, out_dir)
    print(f"wrote {len(backgrounds)} battle backgrounds -> {out_dir / 'battle_backgrounds.js'}")
    return backgrounds


def main() -> None:
    parser = argparse.ArgumentParser()
    parser.add_argument("--extract-dir", type=Path, default=EXTRACT_FLD)
    parser.add_argument("--out-dir", type=Path, default=OUT)
    args = parser.parse_args()
    export_battle_backgrounds(args.out_dir, args.extract_dir)


if __name__ == "__main__":
    main()
