# -*- coding: utf-8 -*-
"""M2 Bab 3: rute terpendek dan rute tercepat dengan alat bawaan QGIS (Processing, algoritma native). Area layanan: lihat m2_03c.
Penulis: Badar Mubarok Yogaswara. Pemakaian: python-qgis.bat m2_03a_rute_qgis.py <folder paket-m2>"""
import os
import sys
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
import _inisialisasi  # noqa: F401
import processing
from qgis.core import QgsVectorLayer, QgsPointXY, QgsProcessingFeedback

paket = sys.argv[1]
SRC = lambda b, l, f="": os.path.join(paket, b + ".gpkg|layername=" + l + (("|subset=" + f) if f else ""))
fas = QgsVectorLayer(SRC("Fasilitas", "Fasilitas"), "Fasilitas", "ogr")
titik = {f["nama"]: f.geometry().asPoint() for f in fas.getFeatures()}
awal, akhir = titik["Pos Jaga 1"], titik["Pos Jaga 4"]
fmt = lambda p: "%.3f,%.3f [EPSG:32749]" % (p.x(), p.y())


def rute(jaringan, strategi=0, toleransi=0.0, a=awal, b=akhir):
    lyr = QgsVectorLayer(jaringan, "jaringan", "ogr")
    hasil = processing.run("native:shortestpathpointtopoint", {
        "INPUT": lyr, "STRATEGY": strategi, "DIRECTION_FIELD": "", "VALUE_FORWARD": "", "VALUE_BACKWARD": "", "VALUE_BOTH": "",
        "DEFAULT_DIRECTION": 2, "SPEED_FIELD": "kecepatan_kmj", "DEFAULT_SPEED": 20, "TOLERANCE": toleransi,
        "START_POINT": fmt(a), "END_POINT": fmt(b), "OUTPUT": "memory:"})
    return hasil["TRAVEL_COST"], hasil["OUTPUT"]


jalan = SRC("Jalan", "Jalan")
jalan_buka = SRC("Jalan", "Jalan", "status<>'ditutup'")
celah = SRC("Jalan_celah", "Jalan_celah", "status<>'ditutup'")
tt = lambda s: "%.1f menit" % (s * 60)

c, o = rute(jalan)
print("1) terpendek, semua ruas      : %.1f m" % c)
c0, o0 = rute(jalan_buka)
print("2) terpendek, ruas tutup dibuang: %.1f m  (jumlah segmen keluaran: %d)" % (c0, o0.featureCount()))
cf, of = rute(jalan_buka, strategi=1)
print("3) tercepat (jam -> menit)    : %s" % tt(cf))
cg, og = rute(celah)
print("4) jalan ber-celah, toleransi 0: %.1f m" % cg)
cg5, og5 = rute(celah, toleransi=5.0)
print("5) jalan ber-celah, toleransi 5: %.1f m" % cg5)

print("Catatan: titik awal dan akhir diambil dari fasilitas yang berjarak 25 m di luar jalan; QGIS menempelkannya ke titik jalan terdekat.")
