# -*- 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"]


petak = muat(PAKET + r"\Petak.gpkg", "Petak", "Petak")
sungai = muat(PAKET + r"\Sungai.gpkg", "Sungai", "Sungai")
kampung = muat(PAKET + r"\Permukiman.gpkg", "Permukiman", "Permukiman")
ps = muat(PAKET + r"\Perhutanan_Sosial.gpkg", "Perhutanan_Sosial", "Perhutanan_Sosial")

sempadan = buf(sungai, 25)
zona_kampung = buf(kampung, 20)

# Intersect: bagian petak yang masuk sempadan sungai
irisan = processing.run("native:intersection", {"INPUT": petak, "OVERLAY": sempadan, "OUTPUT": "memory:"})["OUTPUT"]
print("Intersect: %d potongan, %.2f ha" % (irisan.featureCount(), luas_ha(irisan)))

# Difference: petak dikurangi sempadan, lalu dikurangi zona permukiman
sisa = processing.run("native:difference", {"INPUT": petak, "OVERLAY": sempadan, "OUTPUT": "memory:"})["OUTPUT"]
efektif = processing.run("native:difference", {"INPUT": sisa, "OVERLAY": zona_kampung, "OUTPUT": "memory:"})["OUTPUT"]
print("Difference sungai: %.2f ha; ditambah permukiman: %.2f ha" % (luas_ha(sisa), luas_ha(efektif)))

# Union: petak digabung dengan blok perhutanan sosial
gab = processing.run("native:union", {"INPUT": petak, "OVERLAY": ps, "OUTPUT": "memory:"})["OUTPUT"]
luar = [f for f in gab.getFeatures() if f["KODE_PETAK"] is None]
print("Union: %d objek, %d di luar petak (%.2f ha)" % (gab.featureCount(), len(luar), sum(f.geometry().area() for f in luar) / 10000.0))
irisan_ps = processing.run("native:intersection", {"INPUT": petak, "OVERLAY": ps, "OUTPUT": "memory:"})["OUTPUT"]
print("Petak dalam perhutanan sosial: %d potongan, %.2f ha dari %.2f ha blok" % (irisan_ps.featureCount(), luas_ha(irisan_ps), luas_ha(ps)))
