# [SKRIP 3.1: Batch Processing Citra Drone di Latar Belakang (Non-Blocking)]
# Penulis: Badar Mubarok Yogaswara

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

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}")

        processing.run("qgis:rastercalculator", {
            'EXPRESSION': '("{}@1" - "{}@2") / ("{}@1" + "{}@2")'.format(path_in, path_in, path_in, path_in),
            'LAYERS': [path_in],
            'OUTPUT': path_out
        })

        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)
