# Buku "Python untuk GIS", Bab 28: Pola dan Improvisasi: Kerangka Siap Salin dan Cara Mengubahnya
# Latihan akhir: rekap petak dari tiga sumber
import os, csv
import processing
from qgis.core import QgsVectorLayer

DATA = os.environ.get("PY_DATA", r"D:/Latihan")
HASIL = os.environ.get("PY_HASIL", r"D:/Latihan/hasil")
os.makedirs(HASIL, exist_ok=True)

# 1. Muat petak (Pola 28.1)
petak = QgsVectorLayer(DATA + "/paket-b2/Petak_KPH.gpkg|layername=Petak", "Petak", "ogr")
assert petak.isValid(), "Layer tidak terbuka. Cek DATA dan nama berkas."

# 2. Hitung titik panas per petak dengan alat Processing (Pola 28.3)
hitung = processing.run("native:countpointsinpolygon", {
    "POLYGONS": petak, "POINTS": DATA + "/paket-i4/Hotspot_Nasional.gpkg",
    "FIELD": "TITIK_PANAS", "OUTPUT": "TEMPORARY_OUTPUT"})["OUTPUT"]

# 3. Baca volume dari CSV, dengan kode yang dirapikan (Pola 28.7)
volume = {}
with open(DATA + "/paket-b2/Inventarisasi.csv", encoding="utf-8") as fh:
    for b in csv.DictReader(fh):
        volume[b["KODE_PETAK"].strip().upper()] = float(b["VOLUME_M3"])

# 4. Loop fitur dan rakit baris rekap (Pola 28.2)
rekap = []
for f in hitung.getFeatures():
    kode = f["KODE_PETAK"]
    titik = int(f["TITIK_PANAS"])
    vol = volume.get(kode)
    rekap.append([kode, f["NAMA_KPH"], round(f.geometry().area() / 10000, 2),
                  vol if vol is not None else "",
                  titik,
                  "WASPADA" if titik >= 1 else "aman",
                  "" if vol is not None else "tanpa data volume"])

# 5. Tulis CSV dan cetak ringkasan (Pola 28.7 dan 28.8)
judul = ["KODE_PETAK", "NAMA_KPH", "LUAS_HA", "VOLUME_M3", "TITIK_PANAS", "STATUS", "CATATAN"]
with open(HASIL + "/rekap_petak.csv", "w", newline="", encoding="utf-8") as fh:
    tulis = csv.writer(fh)
    tulis.writerow(judul)
    tulis.writerows(rekap)

print("Petak:", len(rekap), "| titik panas:", sum(r[4] for r in rekap))
print("WASPADA:", [r[0] for r in rekap if r[5] == "WASPADA"])
print("Tanpa data volume:", [r[0] for r in rekap if r[6]])
