# Skrip 4.4: menyusun layout peta A4 lanskap (peta, judul, legenda, skala, panah utara) dan mengekspornya
from qgis.core import (QgsProject, QgsPrintLayout, QgsLayoutItemMap, QgsLayoutItemLabel, QgsLayoutItemLegend,
                       QgsLayoutItemScaleBar, QgsLayoutItemPicture, QgsLayoutItemShape, QgsLayoutPoint, QgsLayoutSize,
                       QgsLayoutExporter, QgsRectangle, QgsApplication, QgsLayerTree, QgsLegendStyle,
                       QgsTextFormat, Qgis, QgsMapLayerLegendUtils)
from qgis.PyQt.QtCore import Qt
from qgis.PyQt.QtGui import QColor, QFont
import os

FOLDER = r"D:/KPH_Contoh"   # ganti dengan folder kerja Anda
proyek = QgsProject.instance()
mm = Qgis.LayoutUnit.Millimeters

lama = proyek.layoutManager().layoutByName("Peta_KPH_A4")
if lama is not None:                             # dijalankan ulang: buang layout lama agar nama tidak bentrok
    proyek.layoutManager().removeLayout(lama)
tata = QgsPrintLayout(proyek)
tata.initializeDefaults()                       # halaman A4 lanskap (297 x 210 mm)
tata.setName("Peta_KPH_A4")
proyek.layoutManager().addLayout(tata)

# 1. Peta: ukuran 190 x 140 mm pada skala 1:3000
peta = QgsLayoutItemMap(tata)
peta.setCrs(proyek.crs())
peta.attemptMove(QgsLayoutPoint(10, 28, mm))
peta.attemptResize(QgsLayoutSize(190, 140, mm))   # ukuran dan letak diatur lebih dulu
peta.zoomToExtent(QgsRectangle(312000, 9996000, 312400, 9996400))   # pas ke area KPH
peta.setScale(3000)                               # skala diatur terakhir
peta.setFrameEnabled(True)
tata.addLayoutItem(peta)

# 2. Judul
judul = QgsLayoutItemLabel(tata)
judul.setText("PETA KPH CONTOH: VOLUME KAYU PER PETAK")
fmt = QgsTextFormat()
fmt.setFont(QFont("Arial", 18, QFont.Weight.Bold))
fmt.setSize(18)
judul.setTextFormat(fmt)
judul.attemptMove(QgsLayoutPoint(10, 8, mm))
judul.attemptResize(QgsLayoutSize(277, 14, mm))
tata.addLayoutItem(judul)

# 3. Legenda: dibuat manual agar nama entrinya ramah dibaca
legenda = QgsLayoutItemLegend(tata)
legenda.setLinkedMap(peta)
legenda.setSyncMode(Qgis.LegendSyncMode.Manual)   # isi legenda tidak ikut berubah otomatis
akar = legenda.model().rootGroup()
nama_baru = {"Petak_KPH": "Volume kayu (m3/ha)", "Hotspot_Nasional": "Titik panas",
             "Sungai": "Sungai", "Jalan": "Jalan", "Belum diukur": "Petak belum diukur"}
for simpul in list(akar.children()):
    if simpul.name() in nama_baru:
        baru = nama_baru[simpul.name()]
        if len(legenda.model().layerLegendNodes(simpul)) == 1:   # entri tunggal: ganti label entri (nama layer di proyek tetap)
            QgsMapLayerLegendUtils.setLegendNodeUserLabel(simpul, 0, baru)
            legenda.model().refreshLayerLegend(simpul)
        else:                                                    # beberapa entri: ganti judul kelompoknya
            simpul.setCustomProperty("legend/title-label", baru)
legenda.setTitle("Legenda")
legenda.attemptMove(QgsLayoutPoint(205, 28, mm))
tata.addLayoutItem(legenda)

# 4. Batang skala: 2 segmen, tiap segmen 100 m
skala = QgsLayoutItemScaleBar(tata)
skala.setLinkedMap(peta)
skala.setStyle("Single Box")
skala.setUnits(Qgis.DistanceUnit.Meters)
skala.setUnitLabel("m")
skala.setNumberOfSegments(2)
skala.setNumberOfSegmentsLeft(0)
skala.setUnitsPerSegment(100)
skala.attemptMove(QgsLayoutPoint(12, 174, mm))
tata.addLayoutItem(skala)

# 5. Panah utara (gambar SVG bawaan QGIS)
panah = QgsLayoutItemPicture(tata)
for folder in QgsApplication.svgPaths():
    berkas = os.path.join(folder, "arrows", "NorthArrow_02.svg")
    if os.path.exists(berkas):
        panah.setPicturePath(berkas)
        break
panah.attemptMove(QgsLayoutPoint(270, 28, mm))
panah.attemptResize(QgsLayoutSize(15, 15, mm))
panah.setLinkedMap(peta)                          # panah ikut arah utara peta
tata.addLayoutItem(panah)

# 6. Teks skala angka, CRS, sumber, dan penulis
catatan = QgsLayoutItemLabel(tata)
catatan.setText("Skala 1:3.000 (A4). Sistem koordinat: WGS 84 / UTM zona 49S (EPSG:32749).\n"
                "Sumber: data sintetis latihan, bukan kondisi lapangan. Penyusun: Analis Muda, KPH Contoh.")
fmt2 = QgsTextFormat()
fmt2.setFont(QFont("Arial"))
fmt2.setSize(8)
catatan.setTextFormat(fmt2)
catatan.attemptMove(QgsLayoutPoint(10, 192, mm))
catatan.attemptResize(QgsLayoutSize(277, 12, mm))
tata.addLayoutItem(catatan)

# 7. Ekspor
pengekspor = QgsLayoutExporter(tata)
hasil_pdf = pengekspor.exportToPdf(os.path.join(FOLDER, "Peta_KPH.pdf"), QgsLayoutExporter.PdfExportSettings())
pengaturan = QgsLayoutExporter.ImageExportSettings()
pengaturan.dpi = 150
hasil_png = pengekspor.exportToImage(os.path.join(FOLDER, "Peta_KPH.png"), pengaturan)
print("PDF:", hasil_pdf, " PNG:", hasil_png)
print("Skala peta: 1:%d" % round(peta.scale()), " Tinggi peta (mm):", round(peta.rect().height()))
