#!/usr/bin/env python3
"""Prepare local mods, zip them, generate config, and commit."""

import os
import subprocess
import sys

BASE = os.path.dirname(os.path.abspath(__file__))
SCRIPTS = os.path.join(BASE, "scripts")
PREPARE_LOCAL = os.path.join(BASE, "prepare_local")
AUTOGEN = os.path.join(SCRIPTS, "autogen_config.py")
LOCALMODS_DIR = os.path.join(BASE, "LocalMods")
ZIP_PATH = os.path.join(BASE, "LocalMods.zip")


def log_ok(msg):
    print(f"\033[92m✓\033[0m {msg}")

def log_info(msg):
    print(f"• {msg}")

def log_err(msg):
    print(f"\033[91m✗\033[0m {msg}", file=sys.stderr)

def run(cmd, cwd=None):
    result = subprocess.run(cmd, cwd=cwd, capture_output=True, text=True)
    if result.returncode != 0:
        print(result.stdout)
        print(result.stderr, file=sys.stderr)
        sys.exit(result.returncode)
    return result.stdout.strip()


def zip_localmods():
    import zipfile
    log_info(f"Zipping {LOCALMODS_DIR} → {ZIP_PATH}")

    if os.path.exists(ZIP_PATH):
        os.remove(ZIP_PATH)

    count = 0
    with zipfile.ZipFile(ZIP_PATH, "w", zipfile.ZIP_DEFLATED) as zf:
        for root, dirs, files in os.walk(LOCALMODS_DIR):
            for fn in files:
                full = os.path.join(root, fn)
                arcname = os.path.relpath(full, BASE)
                zf.write(full, arcname)
                count += 1

    size = os.path.getsize(ZIP_PATH)
    log_ok(f"Zipped {count} files ({size / 1024:.1f} KB)")


def main():
    msg = " ".join(sys.argv[1:]) if len(sys.argv) > 1 else "Update LocalMods"

    print()
    print("╔════════════════════════════════════╗")
    print("║        Prep: mods → zip → commit  ║")
    print("╚════════════════════════════════════╝")
    print()

    # 1. Run prepare_local
    log_info("Step 1: Copy mods from workshop...")
    run([sys.executable, PREPARE_LOCAL])
    log_ok("LocalMods ready")
    print()

    # 2. Zip LocalMods
    log_info("Step 2: Zipping LocalMods/...")
    zip_localmods()
    print()

    # 3. Run autogen_config
    log_info("Step 3: Generating config_player.xml...")
    run([sys.executable, AUTOGEN])
    log_ok("config_player.xml generated")
    print()

    # 4. Git add and commit (no push)
    log_info("Step 4: Committing...")
    run(["git", "add", "-A"], cwd=BASE)
    run(["git", "commit", "-m", msg], cwd=BASE)
    log_ok(f"Committed: {msg}")
    print()

    log_ok("Done. Push manually when ready.")


if __name__ == "__main__":
    main()
