# -*- coding: utf-8 -*-
"""Memeriksa metadata dan mengemas plugin menjadi zip (hanya berkas lokal). Penulis: Badar Mubarok Yogaswara
Jalankan: python kemas_plugin.py [folder_plugin]   (Python biasa sudah cukup; tanpa QGIS)
"""
import configparser, os, re, sys, zipfile

WAJIB = ["name", "qgisMinimumVersion", "description", "about", "version", "author", "email", "repository"]
POLA_VERSI = re.compile(r"^\d+\.\d+\.\d+$")


def periksa(folder):
    """Kembalikan daftar masalah (kosong = lolos)."""
    masalah = []
    if not os.path.isfile(os.path.join(folder, "__init__.py")):
        masalah.append("tidak ada __init__.py")
    else:
        with open(os.path.join(folder, "__init__.py"), encoding="utf-8") as fh:
            ada_factory = "def classFactory" in fh.read()
        if not ada_factory:
            masalah.append("__init__.py tidak punya classFactory")
    meta = os.path.join(folder, "metadata.txt")
    if not os.path.isfile(meta):
        return masalah + ["tidak ada metadata.txt"]
    cp = configparser.ConfigParser()
    cp.read(meta, encoding="utf-8")
    g = cp["general"] if "general" in cp else {}
    for k in WAJIB:
        if not g.get(k):
            masalah.append("bidang metadata kosong: " + k)
    if g.get("version") and not POLA_VERSI.match(g["version"]):
        masalah.append("versi bukan pola mayor.minor.tambal: " + g["version"])
    return masalah


def kemas(folder, keluar):
    nama = os.path.basename(os.path.normpath(folder))
    induk = os.path.dirname(os.path.abspath(folder))
    ver = configparser.ConfigParser()
    ver.read(os.path.join(folder, "metadata.txt"), encoding="utf-8")
    berkas = os.path.join(keluar, "%s-%s.zip" % (nama, ver["general"]["version"]))
    os.makedirs(keluar, exist_ok=True)
    with zipfile.ZipFile(berkas, "w", zipfile.ZIP_DEFLATED) as zf:
        for r, _, fs in os.walk(folder):
            if "__pycache__" in r:
                continue
            for f in fs:
                p = os.path.join(r, f)
                zf.write(p, os.path.relpath(p, induk))
    return berkas


if __name__ == "__main__":
    aq = os.path.dirname(os.path.abspath(__file__))
    folder = sys.argv[1] if len(sys.argv) > 1 else os.path.join(aq, "plugin_ringkas_kph")
    m = periksa(folder)
    if m:
        print("GAGAL:", m)
        sys.exit(1)
    z = kemas(folder, os.path.join(aq, "keluaran"))
    print("LOLOS. Zip:", os.path.basename(z))
    with zipfile.ZipFile(z) as zf:
        print("isi:", zf.namelist())
    # uji kegagalan: folder tanpa metadata
    import tempfile
    with tempfile.TemporaryDirectory() as t:
        with open(os.path.join(t, "__init__.py"), "w") as fh:
            fh.write("x = 1\n")
        print("uji folder rusak ->", periksa(t))
