# Skrip 3.1: menggambar (digitasi) jalan dan persemaian lewat Python, lalu membelah satu petak (QGIS Python Console)
# Penulis: Badar Mubarok Yogaswara
# Hasilnya sama dengan yang Anda kerjakan dengan mouse di Bab 3, tetapi simpul diketik sebagai koordinat.
import os
import shutil
from qgis.core import (QgsVectorLayer, QgsRasterLayer, QgsFeature, QgsGeometry, QgsPointXY, QgsPoint, QgsLineString)

DATA = os.environ.get("B2_DATA", r"C:/KPH_Contoh/paket-b2")
KELUAR = os.environ.get("B2_KELUAR", r"C:/KPH_Contoh/keluaran")
os.makedirs(KELUAR, exist_ok=True)
X0, Y0 = 312000.0, 9996000.0          # sudut barat-daya area contoh

# Salin lapisan kosong agar berkas asli di paket data tidak berubah
for nama in ("Jalan_Baru.gpkg", "Persemaian_Baru.gpkg", "Petak_KPH.gpkg"):
    shutil.copy(os.path.join(DATA, nama), os.path.join(KELUAR, nama))

jalan = QgsVectorLayer(KELUAR + "/Jalan_Baru.gpkg|layername=Jalan_Baru", "Jalan_Baru", "ogr")
semai = QgsVectorLayer(KELUAR + "/Persemaian_Baru.gpkg|layername=Persemaian_Baru", "Persemaian_Baru", "ogr")
petak = QgsVectorLayer(KELUAR + "/Petak_KPH.gpkg|layername=Petak", "Petak", "ogr")
citra = QgsRasterLayer(DATA + "/Citra_Sketsa.tif", "Citra_Sketsa")


def titik(x, y):
    return QgsPointXY(X0 + x, Y0 + y)


# 1. Jalan (garis): 6 simpul, diukur dari sudut barat-daya (meter)
simpul_jalan = [(0, 150), (90, 160), (180, 210), (260, 215), (330, 260), (400, 275)]
# Pemeriksaan: warna citra di tiap simpul harus cokelat (jalan tanah), bukan hijau
for x, y in simpul_jalan:
    xs = min(x, 399)      # simpul di tepi citra digeser 1 m ke dalam agar terbaca
    nilai = [citra.dataProvider().sample(titik(xs, y), b)[0] for b in (1, 2, 3)]
    print("Citra di simpul", (x, y), "RGB =", [int(v) for v in nilai])

jalan.startEditing()
f = QgsFeature(jalan.fields())
f.setGeometry(QgsGeometry.fromPolylineXY([titik(x, y) for x, y in simpul_jalan]))
f["NAMA_JALAN"] = "Jalan Inspeksi Timur"
f["KELAS"] = "Jalan tanah"
f["PANJANG_M"] = round(f.geometry().length(), 1)
jalan.addFeature(f)
print("Commit jalan:", jalan.commitChanges(), "| panjang (m):", round(f.geometry().length(), 1))

# 2. Persemaian (poligon): 5 simpul
simpul_semai = [(220, 25), (280, 20), (290, 70), (250, 85), (215, 65)]
semai.startEditing()
g = QgsGeometry.fromPolygonXY([[titik(x, y) for x, y in simpul_semai]])
f = QgsFeature(semai.fields())
f.setGeometry(g)
f["NAMA"] = "Persemaian Utara"
f["LUAS_M2"] = round(g.area(), 1)
semai.addFeature(f)
print("Commit persemaian:", semai.commitChanges(), "| luas (m2):", round(g.area(), 1), "| ha:", round(g.area() / 10000, 4))

# 3. Membelah petak P-12 dengan garis tegak x = 350 (pilih P-12 lebih dulu supaya petak lain tidak ikut terbelah)
petak.selectByExpression("\"KODE_PETAK\" = 'P-12'")
if petak.selectedFeatureCount() == 0:
    raise SystemExit("P-12 tidak ditemukan; pembelahan dibatalkan agar petak lain tidak ikut terbelah.")
luas_awal = sum(ft.geometry().area() for ft in petak.selectedFeatures())
petak.startEditing()
garis_belah = QgsLineString([QgsPoint(X0 + 350, Y0 + 190), QgsPoint(X0 + 350, Y0 + 310)])
hasil, _ = petak.splitFeatures(garis_belah, False, False)
print("Hasil belah:", hasil)
print("Jumlah petak setelah belah (sebelum commit):", petak.featureCount())
print("Commit petak:", petak.commitChanges())
print("Jumlah petak setelah commit:", petak.featureCount())
for ft in petak.getFeatures():
    if ft["KODE_PETAK"] == "P-12":
        print("P-12 bagian:", ft.id(), round(ft.geometry().area(), 1), "m2")
sisa = sum(ft.geometry().area() for ft in petak.getFeatures() if ft["KODE_PETAK"] == "P-12")
print("Luas P-12 sebelum:", round(luas_awal, 1), "| jumlah dua bagian:", round(sisa, 1))
