# [SKRIP 4.3: Menangkap galat dari alat Processing dengan pembungkus kecil]
# Penulis: Badar Mubarok Yogaswara
import traceback
import processing
from qgis.core import QgsVectorLayer, QgsProcessingException, QgsMessageLog, Qgis

DATA = "D:/Latihan/paket-i4"
HASIL = "D:/Latihan/hasil_i4"


def jalankan_aman(alat, parameter):
    """Mengembalikan (hasil, pesan). Bila alat gagal: hasil = None dan pesan berisi sebabnya."""
    try:
        return processing.run(alat, parameter), ""
    except QgsProcessingException as e:          # galat milik Processing
        QgsMessageLog.logMessage("%s gagal: %s" % (alat, e), "Otomasi KPH", Qgis.Warning)
        return None, str(e).replace("\n", " | ")
    except Exception:                            # galat Python lain: simpan jejak untuk diagnosis
        return None, "galat tak terduga: " + traceback.format_exc().splitlines()[-1]


sungai = QgsVectorLayer(DATA + "/Sungai.gpkg", "Sungai", "ogr")

# Kasus 1: berjalan normal
hasil, pesan = jalankan_aman("native:buffer", {
    "INPUT": sungai, "DISTANCE": 30, "OUTPUT": "TEMPORARY_OUTPUT"})
print("Kasus 1:", "OK, %d fitur" % hasil["OUTPUT"].featureCount() if hasil else "GAGAL: " + pesan)

# Kasus 2: masukan tidak ada
hasil, pesan = jalankan_aman("native:buffer", {
    "INPUT": DATA + "/tidak_ada.gpkg", "DISTANCE": 30, "OUTPUT": "TEMPORARY_OUTPUT"})
print("Kasus 2:", "OK" if hasil else "GAGAL: " + pesan)

# Kasus 3: nama alat salah ketik
hasil, pesan = jalankan_aman("native:buffr", {})
print("Kasus 3:", "OK" if hasil else "GAGAL: " + pesan)

# Kasus 4: parameter wajib (OVERLAY) tidak diisi
hasil, pesan = jalankan_aman("native:clip", {"INPUT": sungai, "OUTPUT": "TEMPORARY_OUTPUT"})
print("Kasus 4:", "OK" if hasil else "GAGAL: " + pesan)
