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


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

# Buffer sungai 25 m, tanpa dissolve dan dengan dissolve
tanpa = processing.run("native:buffer", {"INPUT": sungai, "DISTANCE": 25, "DISSOLVE": False, "OUTPUT": "memory:"})["OUTPUT"]
gabung = buf(sungai, 25)
print("Tanpa dissolve: %d objek, %.2f ha (tumpang tindih terhitung dua kali)" % (tanpa.featureCount(), luas_ha(tanpa)))
print("Dengan dissolve: %d objek, %.2f ha" % (gabung.featureCount(), luas_ha(gabung)))

# Jarak berbeda menurut orde sungai: 30 m untuk orde 1, 15 m untuk orde 2
rumus = 'CASE WHEN "ORDE" = 1 THEN 30 ELSE 15 END'
variabel = processing.run("native:buffer", {"INPUT": sungai, "DISTANCE": QgsProperty.fromExpression(rumus), "DISSOLVE": True, "OUTPUT": "memory:"})["OUTPUT"]
print("Jarak variabel: %.2f ha" % luas_ha(variabel))

# Buffer permukiman 20 m
print("Buffer permukiman 20 m: %.2f ha" % luas_ha(buf(kampung, 20)))
