# -*- 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")
kph = muat(DATA + r"\Batas_KPH.gpkg", "Batas_KPH", "Batas_KPH")

# 1. Periksa CRS dan jumlah objek tiap layer
for lyr in (petak, sungai, kampung, kph):
    print(lyr.name(), lyr.crs().authid(), lyr.featureCount(), "objek")

# 2. Periksa kevalidan geometri (laporan, bukan perbaikan)
hasil = processing.run("native:checkvalidity", {"INPUT_LAYER": petak, "METHOD": 2, "VALID_OUTPUT": "memory:", "INVALID_OUTPUT": "memory:", "ERROR_OUTPUT": "memory:"})
print("Petak valid:", hasil["VALID_COUNT"], "tidak valid:", hasil["INVALID_COUNT"])

# 3. Potong sungai dengan KPH Gamma saja (Clip), hasil sementara
gamma = processing.run("native:extractbyexpression", {"INPUT": kph, "EXPRESSION": "\"NAMA_KPH\" = 'KPH Gamma'", "OUTPUT": "memory:"})["OUTPUT"]
potong = processing.run("native:clip", {"INPUT": sungai, "OVERLAY": gamma, "OUTPUT": "memory:"})["OUTPUT"]
panjang = sum(f.geometry().length() for f in potong.getFeatures())
print("Sungai di KPH Gamma: %d ruas, %.1f m" % (potong.featureCount(), panjang))
