#!/usr/bin/env python3

import hashlib
import json
from pathlib import Path

PATCH_ROOT = Path("/var/www/patch")
FILES_ROOT = PATCH_ROOT / "files"
MANIFEST_PATH = PATCH_ROOT / "manifest.json"

BASE_URL = "https://patch.pwcltteste.shop/files/"


def sha256_file(path: Path) -> str:
    digest = hashlib.sha256()

    with path.open("rb") as file:
        while chunk := file.read(1024 * 1024):
            digest.update(chunk)

    return digest.hexdigest()


def next_version() -> str:
    if not MANIFEST_PATH.exists():
        return "1.0.1"

    try:
        manifest = json.loads(
            MANIFEST_PATH.read_text(encoding="utf-8")
        )

        current = manifest.get("version", "1.0.0")
        parts = current.split(".")

        if len(parts) == 3:
            major, minor, patch = map(int, parts)
            return f"{major}.{minor}.{patch + 1}"

        return f"1.0.{int(parts[-1]) + 1}"
    except Exception:
        return "1.0.1"


def main() -> None:
    if not FILES_ROOT.exists():
        raise SystemExit(f"Pasta não encontrada: {FILES_ROOT}")

    files = []

    for path in sorted(FILES_ROOT.rglob("*")):
        if not path.is_file():
            continue

        relative_path = path.relative_to(FILES_ROOT).as_posix()

        files.append({
            "path": relative_path,
            "sha256": sha256_file(path),
            "size": path.stat().st_size
        })

    manifest = {
        "version": next_version(),
        "baseUrl": BASE_URL,
        "files": files,
        "delete": []
    }

    MANIFEST_PATH.write_text(
        json.dumps(
            manifest,
            indent=2,
            ensure_ascii=False
        ) + "\n",
        encoding="utf-8"
    )

    print("Manifesto gerado com sucesso!")
    print(f"Versão: {manifest['version']}")
    print(f"Arquivos: {len(files)}")
    print(f"Caminho: {MANIFEST_PATH}")


if __name__ == "__main__":
    main()
