# Buku "Python untuk GIS", Bab 28: Pola dan Improvisasi: Kerangka Siap Salin dan Cara Mengubahnya
# Pola 28.8: Membuat laporan dari beberapa sumber
import os, csv
from qgis.core import QgsVectorLayer

DATA = os.environ.get("PY_DATA", r"D:/Latihan")
HASIL = os.environ.get("PY_HASIL", r"D:/Latihan/hasil")
os.makedirs(HASIL, exist_ok=True)

petak = QgsVectorLayer(DATA + "/paket-b2/Petak_KPH.gpkg|layername=Petak", "Petak", "ogr")
assert petak.isValid(), "Layer tidak terbuka. Cek DATA dan nama berkas."

# Bahan 1: KPH tiap petak dan luas per KPH, dari layer
kph_petak, luas = {}, {}
for f in petak.getFeatures():
    kph = f["NAMA_KPH"]
    kph_petak[f["KODE_PETAK"]] = kph
    luas[kph] = luas.get(kph, 0) + f.geometry().area() / 10000

# Bahan 2: volume per petak dari CSV, dijumlahkan per KPH
volume, kode_csv, asing = {}, set(), []
with open(DATA + "/paket-b2/Inventarisasi.csv", encoding="utf-8") as fh:
    for b in csv.DictReader(fh):
        kode = b["KODE_PETAK"].strip().upper()
        if kode not in kph_petak:
            asing.append(kode)
            continue
        kode_csv.add(kode)
        kph = kph_petak[kode]
        volume[kph] = volume.get(kph, 0) + float(b["VOLUME_M3"])

# Rakit teks laporan
baris = ["LAPORAN RINGKAS KPH CONTOH", "-" * 38,
         f"{'KPH':<10}{'Luas (ha)':>12}{'Volume (m3)':>16}"]
for kph in sorted(luas):
    baris.append(f"{kph:<10}{luas[kph]:>12.2f}{volume.get(kph, 0):>16.1f}")
baris.append("-" * 38)
baris.append(f"{'Total':<10}{sum(luas.values()):>12.2f}{sum(volume.values()):>16.1f}")
baris.append("Petak tanpa data volume: " + ", ".join(sorted(set(kph_petak) - kode_csv)))
baris.append("Kode di CSV yang tidak ada di peta: " + ", ".join(asing))

teks = "\n".join(baris)
with open(HASIL + "/laporan_kph.txt", "w", encoding="utf-8") as fh:
    fh.write(teks + "\n")
print(teks)
