# -*- coding: utf-8 -*-
"""Dasbor HTML satu berkas (tanpa pustaka luar) untuk KPH Contoh. Penulis: Badar Mubarok Yogaswara
Membaca Petak_KPH.gpkg dan Hotspot_Harian.csv, menulis keluaran/dasbor/dasbor.html. Jalankan: python-qgis.bat buat_dasbor.py
"""
import csv, json, os
from collections import defaultdict
from osgeo import ogr
ogr.UseExceptions()
BULAN = ["Jan", "Feb", "Mar", "Apr", "Mei", "Jun", "Jul", "Agu", "Sep", "Okt", "Nov", "Des"]
AQ = os.path.dirname(os.path.abspath(__file__))
PAKET = os.path.abspath(os.path.join(AQ, "..", "..", "..", "data-sintetis", "paket-m4"))
OUT = os.path.join(AQ, "keluaran", "dasbor")


def hitung():
    petak = {}
    ds = ogr.Open(os.path.join(PAKET, "Petak_KPH.gpkg"))
    for f in ds.GetLayer(0):
        petak[f["ID_Petak"]] = {"kph": f["NAMA_KPH"], "luas": f["Luas_Ha"]}
    per_hari = defaultdict(int)
    per_petak = defaultdict(int)
    per_kph = defaultdict(int)
    with open(os.path.join(PAKET, "Hotspot_Harian.csv"), encoding="utf-8") as fh:
        for b in csv.DictReader(fh):
            j = int(b["Jumlah"])
            if b["ID_Petak"] not in petak:
                raise ValueError("ID_Petak %s di Hotspot_Harian.csv tidak ada di Petak_KPH.gpkg" % b["ID_Petak"])
            per_hari[b["Tanggal"]] += j
            per_petak[b["ID_Petak"]] += j
            per_kph[petak[b["ID_Petak"]]["kph"]] += j
    luas_kph = defaultdict(float)
    for p in petak.values():
        luas_kph[p["kph"]] += p["luas"]
    hari_puncak = max(per_hari, key=lambda k: (per_hari[k], k))
    teratas = sorted(per_petak.items(), key=lambda kv: (-kv[1], kv[0]))[:3]
    return {
        "total": sum(per_hari.values()), "hari": sorted(per_hari.items()), "hari_puncak": hari_puncak,
        "jumlah_puncak": per_hari[hari_puncak], "per_kph": dict(per_kph), "luas_kph": dict(luas_kph),
        "teratas": teratas, "jumlah_petak": len(petak),
    }


def label_tgl(tanggal):
    """'2026-09-30' -> '30 Sep' (hari tanpa nol di depan)."""
    return "%d %s" % (int(tanggal[8:10]), BULAN[int(tanggal[5:7]) - 1])


def garis_svg(hari, w=520, h=160):
    mx = max(v for _, v in hari) or 1
    pts = " ".join("%.1f,%.1f" % (10 + i * (w - 20) / max(len(hari) - 1, 1), h - 15 - v * (h - 30) / mx) for i, (_, v) in enumerate(hari))
    return ('<svg viewBox="0 0 %d %d" role="img" aria-label="Titik panas per hari"><polyline fill="none" stroke="#C0392B" '
            'stroke-width="2.5" points="%s"/><text x="10" y="%d" font-size="11" fill="#555">%s</text>'
            '<text x="%d" y="%d" font-size="11" fill="#555" text-anchor="end">%s</text></svg>') % (w, h, pts, h - 2, label_tgl(hari[0][0]), w - 10, h - 2, label_tgl(hari[-1][0]))


def batang_svg(data, w=520):
    mx = max(data.values()) or 1
    baris = []
    for i, (k, v) in enumerate(sorted(data.items())):
        y = 8 + i * 34
        baris.append('<text x="0" y="%d" font-size="13" fill="#333">%s</text><rect x="90" y="%d" width="%.1f" height="20" fill="#2B6CB0"/>'
                     '<text x="%.1f" y="%d" font-size="13" fill="#333">%d</text>' % (y + 15, k, y, v * (w - 150) / mx, 96 + v * (w - 150) / mx, y + 15, v))
    return '<svg viewBox="0 0 %d %d" role="img" aria-label="Titik panas per KPH">%s</svg>' % (w, 8 + len(data) * 34, "".join(baris))


def tulis(d):
    os.makedirs(OUT, exist_ok=True)
    kartu = [("Total titik panas (30 hari)", d["total"]), ("Hari puncak", "%s (%d titik)" % (d["hari_puncak"][-2:] + " " + BULAN[int(d["hari_puncak"][5:7]) - 1], d["jumlah_puncak"])),
             ("Jumlah petak", d["jumlah_petak"]), ("Petak teratas", "%s (%d)" % d["teratas"][0])]
    html = """<!doctype html><html lang="id"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1">
<title>Dasbor KPH Contoh</title><style>
body{font-family:system-ui,sans-serif;margin:0;background:#f4f6f9;color:#1F3A5F}
main{max-width:900px;margin:auto;padding:16px}.kartu{display:grid;grid-template-columns:repeat(auto-fit,minmax(190px,1fr));gap:12px}
.k{background:#fff;border-radius:8px;padding:12px}.k b{display:block;font-size:22px}
.p{background:#fff;border-radius:8px;padding:12px;margin-top:12px}svg{width:100%%;height:auto}
</style></head><body><main><h1>Dasbor KPH Contoh: titik panas September</h1>
<div class="kartu">%s</div>
<div class="p"><h2>Titik panas per hari</h2>%s</div>
<div class="p"><h2>Titik panas per KPH</h2>%s</div>
<p>Data sintetis. Bukan kondisi lapangan sebenarnya.</p></main></body></html>""" % (
        "".join('<div class="k">%s<b>%s</b></div>' % (a, b) for a, b in kartu), garis_svg(d["hari"]), batang_svg(d["per_kph"]))
    with open(os.path.join(OUT, "dasbor.html"), "w", encoding="utf-8") as fh:
        fh.write(html)


if __name__ == "__main__":
    d = hitung()
    tulis(d)
    print(json.dumps({k: d[k] for k in ("total", "hari_puncak", "jumlah_puncak", "per_kph", "luas_kph", "teratas", "jumlah_petak")}, ensure_ascii=False))
