# Skrip 4.2: simbologi Graduated untuk Volume_m3ha, membandingkan metode klasifikasi,
# dan menangani petak yang nilainya kosong (NULL)
from qgis.core import (QgsProject, QgsStyle, QgsGraduatedSymbolRenderer, QgsClassificationEqualInterval,
                       QgsClassificationQuantile, QgsClassificationJenks, QgsFillSymbol, QgsVectorLayer,
                       QgsSingleSymbolRenderer, QgsSymbolLayerUtils)

FOLDER = r"D:/KPH_Contoh"   # ganti dengan folder kerja Anda

petak = QgsProject.instance().mapLayersByName("Petak_KPH")[0]

# 1. Periksa nilai kosong. Metode Quantile dan Natural Breaks membacanya sebagai nol.
kosong = [f["ID_Petak"] for f in petak.getFeatures() if f["Volume_m3ha"] is None]
print("Petak tanpa nilai:", kosong)

# 2. Saring sementara: hanya petak yang terisi ikut dihitung
petak.setSubsetString('"Volume_m3ha" IS NOT NULL')

def pasang(kelas_metode, jumlah=4):
    metode = kelas_metode()     # objek metode baru tiap kali dipakai
    rend = QgsGraduatedSymbolRenderer("Volume_m3ha")
    rend.setSourceSymbol(QgsFillSymbol.createSimple({"outline_color": "#404040", "outline_width": "0.3"}))
    rend.setClassificationMethod(metode)
    rend.updateClasses(petak, jumlah)
    rend.updateColorRamp(QgsStyle.defaultStyle().colorRamp("YlGn"))   # skala kuning ke hijau, objek baru tiap kali
    return rend

for kelas_metode in (QgsClassificationEqualInterval, QgsClassificationQuantile, QgsClassificationJenks):
    rend = pasang(kelas_metode)
    print(rend.classificationMethod().name())
    for i, r in enumerate(rend.ranges()):
        # nilai tepat di batas masuk kelas bawahnya; kelas pertama memuat nilai terkecil
        n = sum(1 for f in petak.getFeatures()
                if (r.lowerValue() < f["Volume_m3ha"] <= r.upperValue()) or (i == 0 and f["Volume_m3ha"] == r.lowerValue()))
        print("   %7.1f - %7.1f   %d petak" % (r.lowerValue(), r.upperValue(), n))

# 3. Pakai Quantile (4 kelas) pada layer, lalu lepas saringan
rend = pasang(QgsClassificationQuantile)
petak.setRenderer(rend)
petak.setSubsetString("")
petak.triggerRepaint()

# 4. Petak yang belum diukur ditampilkan sebagai layer tersendiri berwarna abu-abu
belum = QgsVectorLayer(FOLDER + "/Petak_KPH.gpkg|layername=Petak_KPH", "Belum diukur", "ogr")
belum.setSubsetString('"Volume_m3ha" IS NULL')
belum.setRenderer(QgsSingleSymbolRenderer(QgsFillSymbol.createSimple(
    {"color": "#D0D0D0", "outline_color": "#404040", "outline_width": "0.3", "style": "b_diagonal"})))
proyek = QgsProject.instance()
proyek.addMapLayer(belum, False)              # False: belum dimasukkan ke panel Layers
akar = proyek.layerTreeRoot()
posisi = akar.children().index(akar.findLayer(petak.id()))
akar.insertLayer(posisi, belum)               # tepat di atas Petak_KPH
print("Layer Belum diukur:", belum.featureCount(), "petak")
