# [SKRIP 3.1 - ALTERNATIF: Batch Processing Citra Drone di Latar Belakang (Non-Blocking)]
# Penulis: Badar Mubarok Yogaswara
# Perbedaan dengan Skrip 3.1: memakai native:rastercalc (terdokumentasi) dengan layer bernama,
# bukan qgis:rastercalculator dengan nama layer berupa jalur berkas.

import os
import processing
from qgis.core import QgsTask, QgsApplication, QgsMessageLog, Qgis, QgsRasterLayer

folder_input = "D:/Data_Drone/Ortofoto_Mentah/"
folder_output = "D:/Data_Drone/NDVI_Hasil/"

def proses_batch_ndvi(task, folder_in, folder_out):
    QgsMessageLog.logMessage("Memulai Batch Processing di Latar Belakang...", "Analisis Drone", Qgis.Info)
    os.makedirs(folder_out, exist_ok=True)

    file_list = [f for f in os.listdir(folder_in) if f.endswith('.tif')]
    total_files = len(file_list)

    for i, file_name in enumerate(file_list):
        if task.isCanceled():
            return False

        path_in = os.path.join(folder_in, file_name)
        path_out = os.path.join(folder_out, f"NDVI_{file_name}")

        # Beri nama layer agar bisa dirujuk di ekspresi
        layer_in = QgsRasterLayer(path_in, "ortofoto", "gdal")

        try:
            processing.run("native:rastercalc", {
                'EXPRESSION': '("ortofoto@1" - "ortofoto@2") / ("ortofoto@1" + "ortofoto@2")',
                'LAYERS': [layer_in],
                'OUTPUT': path_out
            })
        except Exception as e:
            QgsMessageLog.logMessage(f"Gagal memproses {file_name}: {e}", "Analisis Drone", Qgis.Critical)
            return False

        if not os.path.exists(path_out):
            QgsMessageLog.logMessage(f"Keluaran tidak terbentuk: {path_out}", "Analisis Drone", Qgis.Critical)
            return False

        task.setProgress((i + 1) / total_files * 100)

    return True

def task_selesai(exception, result=None):
    if result:
        QgsMessageLog.logMessage("✅ Batch Processing Selesai 100%!", "Analisis Drone", Qgis.Success)
    else:
        QgsMessageLog.logMessage("❌ Proses dibatalkan atau error.", "Analisis Drone", Qgis.Warning)

task_ndvi = QgsTask.fromFunction("Kalkulasi NDVI 50 Ubin", proses_batch_ndvi,
                                 on_finished=task_selesai,
                                 folder_in=folder_input, folder_out=folder_output)

QgsApplication.taskManager().addTask(task_ndvi)
