#!/usr/bin/env python3

import hashlib
import json
import os
import shutil
import sys
from pathlib import Path


BASE_DIR = Path(
    "/opt/rpgmultiplayer/updates/chaapaai"
)

VERSIONS_DIR = BASE_DIR / "versions"
INSTALLERS_DIR = BASE_DIR / "installers"
LATEST_FILE = BASE_DIR / "latest.json"


def read_latest():
    if not LATEST_FILE.exists():
        raise RuntimeError(
            "latest.json wurde nicht gefunden."
        )

    with LATEST_FILE.open("r", encoding="utf-8") as f:
        return json.load(f)


def sha256_file(path):
    digest = hashlib.sha256()

    with path.open("rb") as f:
        while True:
            chunk = f.read(1024 * 1024)
            if not chunk:
                break
            digest.update(chunk)

    return digest.hexdigest()


def main():
    if len(sys.argv) > 2:
        print("Usage:")
        print("  python3 create_installer.py")
        print("  python3 create_installer.py 1.2.0")
        sys.exit(1)

    latest = read_latest()

    latest_version = str(
        latest.get("version", "")
    ).strip()

    if not latest_version:
        raise RuntimeError(
            "latest.json enthaelt keine Version."
        )

    if len(sys.argv) == 2:
        version = sys.argv[1].strip()
    else:
        version = latest_version

    release_dir = VERSIONS_DIR / version
    files_dir = release_dir / "files"

    if not release_dir.exists():
        raise RuntimeError(
            "Release nicht gefunden:\n" +
            str(release_dir)
        )

    if not files_dir.exists():
        raise RuntimeError(
            "Release-Dateiordner nicht gefunden:\n" +
            str(files_dir)
        )

    INSTALLERS_DIR.mkdir(
        parents=True,
        exist_ok=True
    )

    archive_path = (
        INSTALLERS_DIR /
        ("Chaapaai_" + version + ".zip")
    )

    if archive_path.exists():
        print("WARNUNG: Installer existiert bereits:")
        print(archive_path)
        print()

        answer = input(
            "Ueberschreiben? (yes/no): "
        ).strip().lower()

        if answer != "yes":
            print("Abgebrochen.")
            sys.exit(0)

        archive_path.unlink()

    print()
    print("==============================================")
    print("Chaapa'ai Installer Builder")
    print("Version: " + version)
    print("==============================================")
    print()

    print("Quelle:")
    print(files_dir)
    print()

    print("Erstelle ZIP...")

    archive_without_extension = str(
        archive_path.with_suffix("")
    )

    shutil.make_archive(
        archive_without_extension,
        "zip",
        root_dir=files_dir
    )

    file_count = 0

    for root, dirs, filenames in os.walk(files_dir):
        file_count += len(filenames)

    archive_size = archive_path.stat().st_size
    archive_hash = sha256_file(archive_path)

    print()
    print("==============================================")
    print("Installer erfolgreich erstellt.")
    print()
    print("Version: " + version)
    print("Dateien: " + str(file_count))
    print(
        "Groesse: " +
        f"{archive_size / 1024 / 1024:.2f} MB"
    )
    print()
    print("Datei:")
    print(archive_path)
    print()
    print("SHA-256:")
    print(archive_hash)
    print("==============================================")
    print()


if __name__ == "__main__":
    main()
