# -*- coding: utf-8 -*-
# [SKRIP I3.5] Pagar di dalam berkas: trigger SQLite yang menolak nilai Kondisi di luar tiga pilihan baku.
# Penulis: Badar Mubarok Yogaswara
# Bekerja pada SALINAN GeoPackage dari skrip I3.2 (jangan dipasang dulu pada berkas asli sebelum Anda yakin).
# Dijalankan memakai python-qgis.bat (butuh modul osgeo.ogr).
import shutil
from osgeo import ogr

ogr.UseExceptions()
ASLI = r"D:/KPH_Contoh/Survei_KPH.gpkg"
SALINAN = r"D:/KPH_Contoh/Survei_KPH_pagar.gpkg"
shutil.copy(ASLI, SALINAN)

ds = ogr.Open(SALINAN, 1)
PILIHAN = "'Sehat','Terserang Hama','Tebangan Liar'"
for nama, kejadian in [("cek_kondisi_tambah", "INSERT"), ("cek_kondisi_ubah", "UPDATE OF Kondisi")]:
    ds.ExecuteSQL(
        "CREATE TRIGGER %s BEFORE %s ON Titik_Survei "
        "WHEN NEW.Kondisi IS NULL OR NEW.Kondisi NOT IN (%s) "
        "BEGIN SELECT RAISE(ABORT, 'Kondisi harus salah satu dari tiga pilihan baku'); END;" % (nama, kejadian, PILIHAN))

lyr = ds.GetLayerByName("Titik_Survei")
for coba in ["sehat", "Sehat"]:
    f = ogr.Feature(lyr.GetLayerDefn())
    f.SetGeometry(ogr.CreateGeometryFromWkt("POINT(312100 9996100)"))
    f.SetField("ID_Survei", "UJI-" + coba)
    f.SetField("Kondisi", coba)
    try:
        lyr.CreateFeature(f)
        print("Kondisi '%s' -> DITERIMA" % coba)
    except Exception as e:
        print("Kondisi '%s' -> DITOLAK: %s" % (coba, str(e).split(":")[-1].strip()))
ds = None

ds = ogr.Open(SALINAN)
print("Jumlah baris tersimpan:", ds.GetLayerByName("Titik_Survei").GetFeatureCount())
