# Skrip 2.1: query dan seleksi pada lapisan Petak dan Titik_Plot (QGIS Python Console)
# Penulis: Badar Mubarok Yogaswara
import os
import processing
from qgis.core import Qgis, QgsVectorLayer

DATA = os.environ.get("B2_DATA", r"C:/KPH_Contoh/paket-b2")
petak = QgsVectorLayer(DATA + "/Petak_KPH.gpkg|layername=Petak", "Petak", "ogr")
plot = QgsVectorLayer(DATA + "/Titik_Plot.gpkg|layername=Titik_Plot", "Titik_Plot", "ogr")


def kode_terpilih(lyr):
    return sorted(f["KODE_PETAK"] for f in lyr.selectedFeatures())


# 1. Seleksi dengan ekspresi: jati yang ditanam sebelum 2010
petak.selectByExpression("\"JENIS\" = 'Jati' AND \"TAHUN_TANAM\" < 2010")
print("Jati sebelum 2010:", petak.selectedFeatureCount(), kode_terpilih(petak))

# 2. Seleksi gabungan: status Produksi DAN bukan Jati
petak.selectByExpression("\"STATUS\" = 'Produksi' AND \"JENIS\" <> 'Jati'")
print("Produksi bukan Jati:", petak.selectedFeatureCount())

# 3. Memakai LIKE dan ATAU
petak.selectByExpression("\"JENIS\" LIKE 'S%' OR \"STATUS\" = 'Lindung'")
print("Jenis berawalan S atau Lindung:", petak.selectedFeatureCount(), kode_terpilih(petak))

# 4. Balikkan seleksi
petak.invertSelection()
print("Setelah dibalik:", petak.selectedFeatureCount())
petak.removeSelection()

# 5. Seleksi menurut lokasi: plot yang berada di dalam petak
hasil = processing.run("native:selectbylocation", {
    "INPUT": plot, "PREDICATE": [6], "INTERSECT": petak, "METHOD": 0})   # 6 = within
print("Plot di dalam petak:", plot.selectedFeatureCount(), "dari", plot.featureCount())
plot.selectByExpression("\"ID_PLOT\" IN ('PL-23','PL-24')")
print("Plot di luar (cek):", sorted(f["ID_PLOT"] for f in plot.selectedFeatures()))

# 6. Plot sehat dan berdiameter 30 cm ke atas, di dalam petak
plot.removeSelection()
processing.run("native:selectbylocation", {"INPUT": plot, "PREDICATE": [6], "INTERSECT": petak, "METHOD": 0})
dalam = plot.selectedFeatureCount()
plot.selectByExpression("\"KONDISI\" = 'Sehat' AND \"DIAMETER_CM\" >= 30", Qgis.SelectBehavior.IntersectSelection)   # persempit seleksi yang ada
print("Sehat, diameter >= 30, di dalam petak:", plot.selectedFeatureCount(), "(dari", dalam, "plot di dalam petak)")

# 7. Filter lapisan (Provider Feature Filter): hanya Jati yang tampil
petak.removeSelection()
petak.setSubsetString("\"JENIS\" = 'Jati'")
print("Setelah filter Jati, baris yang tampil:", petak.featureCount())
petak.setSubsetString("")
print("Filter dilepas, baris:", petak.featureCount())
