# -*- coding: utf-8 -*-
"""Processing script gaya dekorator @alg. Penulis: Badar Mubarok Yogaswara"""
from qgis.processing import alg
from qgis.core import QgsFeature, QgsField, QgsFields, QgsFeatureSink, QgsDistanceArea, QgsProcessingException, QgsWkbTypes, Qgis
from qgis.PyQt.QtCore import QMetaType


@alg(name="tambah_luas_ha", label="Tambah kolom luas (hektare)", group="kehutanan", group_label="Kehutanan")
@alg.input(type=alg.SOURCE, name="INPUT", label="Layer poligon", types=[2])
@alg.input(type=alg.SINK, name="OUTPUT", label="Hasil")
def tambah_luas_ha(instance, parameters, context, feedback, inputs):
    """Menambah kolom Luas_Ha_Hitung (hektare, dihitung di elipsoid WGS 84)."""
    sumber = instance.parameterAsSource(parameters, "INPUT", context)
    if sumber is None or QgsWkbTypes.geometryType(sumber.wkbType()) != Qgis.GeometryType.Polygon:
        raise QgsProcessingException("Layer masukan harus bertipe poligon.")
    kolom = QgsFields(sumber.fields())
    kolom.append(QgsField("Luas_Ha_Hitung", QMetaType.Type.Double))
    sink, dest = instance.parameterAsSink(parameters, "OUTPUT", context, kolom, sumber.wkbType(), sumber.sourceCrs())
    if sink is None:
        raise QgsProcessingException("Keluaran tidak bisa dibuat.")
    da = QgsDistanceArea()
    da.setSourceCrs(sumber.sourceCrs(), context.transformContext())
    da.setEllipsoid("WGS84")
    for f in sumber.getFeatures():
        baru = QgsFeature(kolom)
        baru.setGeometry(f.geometry())
        baru.setAttributes(f.attributes() + [round(da.measureArea(f.geometry()) / 10000.0, 3)])
        sink.addFeature(baru, QgsFeatureSink.Flag.FastInsert)
    return {"OUTPUT": dest}
