# Buku "Python untuk GIS", Bab 28: Pola dan Improvisasi: Kerangka Siap Salin dan Cara Mengubahnya
# Pola 28.5: Tahan galat, satu berkas rusak tidak menghentikan semua
import os, glob
from qgis.core import QgsVectorLayer

DATA = os.environ.get("PY_DATA", r"D:/Latihan")


def muat_aman(jalur, kolom_wajib):
    layer = QgsVectorLayer(jalur, "uji", "ogr")
    if not layer.isValid():
        raise ValueError("layer tidak terbuka")
    kurang = [k for k in kolom_wajib if layer.fields().indexOf(k) < 0]
    if kurang:
        raise ValueError("kolom kurang: " + ", ".join(kurang))
    return layer


diterima, ditolak = [], []
for jalur in sorted(glob.glob(DATA + "/paket-i4/Kiriman_Lapangan/*.gpkg")):
    nama = os.path.basename(jalur)
    try:
        layer = muat_aman(jalur, ["Kondisi", "Tinggi_Phn"])
        diterima.append((nama, layer.featureCount()))
    except ValueError as galat:
        ditolak.append((nama, str(galat)))

print("DITERIMA:", len(diterima))
for nama, n in diterima:
    print("  ", nama, n, "titik")
print("DITOLAK:", len(ditolak))
for nama, alasan in ditolak:
    print("  ", nama, "->", alasan)
