# Skrip 5.1: kalkulasi field pada lapisan Petak dengan ekspresi (QGIS Python Console)
# Penulis: Badar Mubarok Yogaswara
import os
import processing
from qgis.core import QgsVectorLayer

DATA = os.environ.get("B2_DATA", r"C:/KPH_Contoh/paket-b2")
KELUAR = os.environ.get("B2_KELUAR", r"C:/KPH_Contoh/keluaran")
os.makedirs(KELUAR, exist_ok=True)
petak = QgsVectorLayer(DATA + "/Petak_KPH.gpkg|layername=Petak", "Petak", "ogr")

TEKS, DESIMAL, BULAT = 2, 0, 1            # kode tipe field untuk alat Field calculator


def tambah(lyr, nama, tipe, rumus, panjang=0, presisi=0):
    """Menjalankan alat Field calculator dan mengembalikan lapisan hasil (sementara di memori)."""
    return processing.run("native:fieldcalculator", {
        "INPUT": lyr, "FIELD_NAME": nama, "FIELD_TYPE": tipe, "FIELD_LENGTH": panjang,
        "FIELD_PRECISION": presisi, "FORMULA": rumus, "OUTPUT": "memory:"})["OUTPUT"]


h = tambah(petak, "LUAS_HA", DESIMAL, "round(area($geometry) / 10000, 3)", 10, 3)
h = tambah(h, "SELISIH_HA", DESIMAL, "round(\"LUAS_HA\" - \"LUAS_LAMA_HA\", 3)", 10, 3)
h = tambah(h, "UMUR", BULAT, "2026 - \"TAHUN_TANAM\"")
h = tambah(h, "KELAS_UMUR", TEKS,
           "CASE WHEN \"UMUR\" < 10 THEN 'Muda' WHEN \"UMUR\" < 15 THEN 'Sedang' ELSE 'Tua' END", 10)
h = tambah(h, "KODE_LENGKAP", TEKS, "\"NAMA_KPH\" || ' / ' || \"KODE_PETAK\"", 30)

print("Kolom:", [f.name() for f in h.fields()])
for f in h.getFeatures():
    print(f["KODE_PETAK"], f["LUAS_HA"], f["LUAS_LAMA_HA"], f["SELISIH_HA"], f["UMUR"], f["KELAS_UMUR"], f["KODE_LENGKAP"])

# Pemeriksaan: jumlah luas tiap KPH dan jumlah petak tiap kelas umur
luas = {}
kelas = {}
for f in h.getFeatures():
    luas[f["NAMA_KPH"]] = round(luas.get(f["NAMA_KPH"], 0) + f["LUAS_HA"], 3)
    kelas[f["KELAS_UMUR"]] = kelas.get(f["KELAS_UMUR"], 0) + 1
print("Luas per KPH (ha):", luas)
print("Petak per kelas umur:", kelas)
print("Total LUAS_HA:", round(sum(f["LUAS_HA"] for f in h.getFeatures()), 3))
beda = [f["KODE_PETAK"] for f in h.getFeatures() if abs(f["SELISIH_HA"]) > 0.06]
print("Petak dengan selisih lebih dari 0,06 ha:", beda)

# Simpan hasil agar dipakai di Bab 6 dan 7
processing.run("native:savefeatures", {"INPUT": h, "OUTPUT": KELUAR + "/Petak_Hitung.gpkg", "LAYER_NAME": "Petak_Hitung"})
print("Tersimpan:", os.path.exists(KELUAR + "/Petak_Hitung.gpkg"))
