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

sisa = processing.run("native:difference", {"INPUT": petak, "OVERLAY": buf(sungai, 25), "OUTPUT": "memory:"})["OUTPUT"]
efektif = processing.run("native:difference", {"INPUT": sisa, "OVERLAY": buf(kampung, 20), "OUTPUT": "memory:"})["OUTPUT"]

# Dissolve per jenis tanaman. Nama kolom diperiksa dulu: salah ketik tidak boleh lolos diam-diam
KOLOM = "JENIS"
assert petak.fields().indexOf(KOLOM) >= 0, "Kolom tidak ada di layer Petak: " + KOLOM
per_jenis = processing.run("native:dissolve", {"INPUT": efektif, "FIELD": [KOLOM], "OUTPUT": "memory:"})["OUTPUT"]
awal = processing.run("native:dissolve", {"INPUT": petak, "FIELD": [KOLOM], "OUTPUT": "memory:"})["OUTPUT"]
luas_awal = {f["JENIS"]: f.geometry().area() / 10000.0 for f in awal.getFeatures()}
for f in sorted(per_jenis.getFeatures(), key=lambda f: f["JENIS"]):
    print("%-7s awal %.2f ha, efektif %.2f ha (multipart: %s)" % (f["JENIS"], luas_awal[f["JENIS"]], f.geometry().area() / 10000.0, f.geometry().isMultipart()))

# Dissolve tanpa field: satu poligon untuk seluruh areal efektif
semua = processing.run("native:dissolve", {"INPUT": efektif, "OUTPUT": "memory:"})["OUTPUT"]
print("Dissolve semua: %d objek, %.2f ha" % (semua.featureCount(), luas_ha(semua)))

# Pecah multipart menjadi satu bagian per objek
tunggal = processing.run("native:multiparttosingleparts", {"INPUT": per_jenis, "OUTPUT": "memory:"})["OUTPUT"]
print("Setelah multipart ke singlepart: %d objek" % tunggal.featureCount())

# Atribut lain setelah dissolve: nilai diambil dari satu objek saja (hati-hati)
for f in sorted(per_jenis.getFeatures(), key=lambda f: f["JENIS"]):
    print(f["JENIS"], "TAHUN_TANAM tersisa =", f["TAHUN_TANAM"])

# Rekap luas tanpa dissolve: tambah field luas, lalu Statistics by categories
hitung = processing.run("native:fieldcalculator", {"INPUT": efektif, "FIELD_NAME": "LUAS_HA", "FIELD_TYPE": 0, "FIELD_LENGTH": 10, "FIELD_PRECISION": 4, "FORMULA": "area($geometry) / 10000", "OUTPUT": "memory:"})["OUTPUT"]
statistik = processing.run("qgis:statisticsbycategories", {"INPUT": hitung, "VALUES_FIELD_NAME": "LUAS_HA", "CATEGORIES_FIELD_NAME": ["JENIS"], "OUTPUT": "memory:"})["OUTPUT"]
for f in sorted(statistik.getFeatures(), key=lambda f: f["JENIS"]):
    print("Statistik %-7s %d petak, jumlah luas %.2f ha" % (f["JENIS"], f["count"], f["sum"]))
