# -*- coding: utf-8 -*-
# Penulis: Badar Mubarok Yogaswara. Dijalankan di Python Console QGIS. Data sintetis, bukan kondisi lapangan nyata.
from qgis.core import QgsVectorLayer, QgsProject, QgsProperty
import processing

PAKET = r"C:\latihan\paket-i1"      # ubah sesuai letak folder di komputer Anda
DATA = r"C:\latihan\paket-data"


def muat(berkas, lapisan, nama):
    """Memuat satu layer GeoPackage dan menambahkannya ke proyek."""
    lyr = QgsVectorLayer("%s|layername=%s" % (berkas, lapisan), nama, "ogr")
    if not lyr.isValid():
        raise RuntimeError("Layer tidak terbaca: " + berkas)
    QgsProject.instance().addMapLayer(lyr)
    return lyr


def luas_ha(lyr):
    """Jumlah luas semua poligon dalam hektare (CRS harus UTM, satuan meter)."""
    return sum(f.geometry().area() for f in lyr.getFeatures()) / 10000.0


def buf(lyr, jarak):
    """Buffer dengan dissolve, hasil sementara."""
    return processing.run("native:buffer", {"INPUT": lyr, "DISTANCE": jarak, "DISSOLVE": True, "OUTPUT": "memory:"})["OUTPUT"]


import os
from collections import Counter
from qgis.core import QgsProcessingModelAlgorithm
from qgis.core import QgsProcessingModelAlgorithm

HASIL = r"C:\latihan\hasil"      # folder keluaran; dibuat bila belum ada
os.makedirs(HASIL, exist_ok=True)

petak = muat(PAKET + r"\Petak.gpkg", "Petak", "Petak")
sungai = muat(PAKET + r"\Sungai.gpkg", "Sungai", "Sungai")
kampung = muat(PAKET + r"\Permukiman.gpkg", "Permukiman", "Permukiman")
kph = muat(DATA + r"\Batas_KPH.gpkg", "Batas_KPH", "Batas_KPH")
titik = muat(DATA + r"\Hotspot_Nasional.gpkg", "Hotspot_Nasional", "Hotspot_Nasional")

# 1. Jalankan model dari Bab 6 (berkas .model3 hasil skrip 6_1 atau hasil susunan Anda sendiri)
model = QgsProcessingModelAlgorithm()
assert model.fromFile(HASIL + r"\areal_efektif.model3"), "Model tidak terbaca; jalankan skrip 6_1 lebih dulu"
hasil = processing.run(model, {
    "PETAK": petak, "SUNGAI": sungai, "PERMUKIMAN": kampung,
    "JARAK_SUNGAI": 25, "JARAK_PERMUKIMAN": 20,
    "petak_efektif": HASIL + r"\Petak_Efektif.gpkg",
    "efektif_per_jenis": HASIL + r"\Efektif_per_Jenis.gpkg"})
efektif = QgsVectorLayer(hasil["petak_efektif"], "Petak_Efektif", "ogr")
print("Areal efektif: %.2f ha dari %.2f ha" % (luas_ha(efektif), luas_ha(petak)))

# 2. Spatial join: setiap potongan petak diberi nama KPH
efektif_kph = processing.run("native:joinattributesbylocation", {"INPUT": efektif, "PREDICATE": [5], "JOIN": kph, "JOIN_FIELDS": ["NAMA_KPH"], "METHOD": 1, "OUTPUT": "memory:"})["OUTPUT"]

# 3. Dissolve per KPH dan jenis, simpan ke GeoPackage
rekap = processing.run("native:dissolve", {"INPUT": efektif_kph, "FIELD": ["NAMA_KPH", "JENIS"], "OUTPUT": HASIL + r"\Rekap_KPH_Jenis.gpkg"})["OUTPUT"]
rekap = QgsVectorLayer(rekap, "Rekap_KPH_Jenis", "ogr")
print("%-10s %-7s %s" % ("KPH", "Jenis", "Efektif (ha)"))
for f in sorted(rekap.getFeatures(), key=lambda f: (f["NAMA_KPH"], f["JENIS"])):
    print("%-10s %-7s %.2f" % (f["NAMA_KPH"], f["JENIS"], f.geometry().area() / 10000.0))
per_kph = Counter()
for f in efektif_kph.getFeatures():
    per_kph[f["NAMA_KPH"]] += f.geometry().area() / 10000.0
print("Total per KPH (ha):", {k: round(v, 2) for k, v in sorted(per_kph.items())})

# 4. Select by location: titik panas yang jatuh di areal efektif
processing.run("native:selectbylocation", {"INPUT": titik, "PREDICATE": [0], "INTERSECT": efektif, "METHOD": 0})
print("Titik panas di areal efektif: %d dari %d" % (titik.selectedFeatureCount(), titik.featureCount()))
titik.removeSelection()
