<?php
// admin/upload_template.php
include 'init.php'; 

$autoload_path = dirname(__DIR__) . '/vendor/autoload.php';

if (!file_exists($autoload_path)) {
    $_SESSION['pesan_error'] = "Library PHPSpreadsheet tidak ditemukan. Harap jalankan 'composer require phpoffice/phpspreadsheet' di root folder proyek.";
    header("Location: dashboard.php"); 
    exit;
}

require $autoload_path; 

use PhpOffice\PhpSpreadsheet\IOFactory;

$type = $_POST['type'] ?? $_GET['type'] ?? null;

if (!$type) {
    $_SESSION['pesan_error'] = "Tipe upload tidak terdefinisi.";
    header('Location: dashboard.php');
    exit;
}

// Redirect URL default
$redirect_url = $type . ".php";

if (!isset($_FILES['excelFile']) || $_FILES['excelFile']['error'] !== UPLOAD_ERR_OK) {
    $_SESSION['pesan_error'] = "Gagal mengunggah file. Pastikan file Excel dipilih. Error: " . ($_FILES['excelFile']['error'] ?? 'Tidak ada file');
    header("Location: " . $redirect_url);
    exit;
}

if (!$id_tahun_aktif) {
    $_SESSION['pesan_error'] = "Tidak ada tahun pemilihan yang aktif. Tidak dapat mengimpor data.";
    header("Location: " . $redirect_url);
    exit;
}

$file_name = $_FILES['excelFile']['tmp_name'];
$results = [];

try {
    
    $jenis_file = IOFactory::identify($file_name);
    $reader = IOFactory::createReader($jenis_file);
    
    if ($jenis_file === 'Csv') {
        $reader->setDelimiter(',');
        $reader->setInputEncoding('UTF-8');
    }

    $spreadsheet = $reader->load($file_name);
    $worksheet = $spreadsheet->getActiveSheet();
    $highestRow = $worksheet->getHighestRow();
    $is_overall_success = true;
    
    $pdo->beginTransaction();

    if ($type === 'pemilih') {
        
        // === PERBAIKAN 1 (BUG KRITIS) ===
        // Ambil data kelas untuk dicocokkan
        // Diubah dari "id_kelas, nama_kelas" menjadi "nama_kelas, id_kelas"
        $kelasList = $pdo->query("SELECT nama_kelas, id_kelas FROM kelas")->fetchAll(PDO::FETCH_KEY_PAIR);
        // ================================
        
        // Ubah array agar 'Nama Kelas' (key) => 'id_kelas' (value)
        $kelas_map = array_change_key_case($kelasList, CASE_LOWER);

        $results = importPemilih($worksheet, $highestRow, $pdo, $id_tahun_aktif, $kelas_map);
        
        // Atur redirect agar kembali ke tab yang benar
        // Kita asumsikan impor pemilih selalu kembali ke tab siswa
        $redirect_url = "pemilih.php?tab=siswa"; 
    
    } elseif ($type === 'siswa' || $type === 'guru' || $type === 'mapel') {
         $_SESSION['pesan_error'] = "Tipe import '{$type}' tidak didukung oleh file ini.";
         $is_overall_success = false;
         
    } else {
        throw new Exception("Tipe import tidak valid.");
    }

    foreach($results as $res) {
        if ($res['status'] === 'error') $is_overall_success = false;
    }

    if ($is_overall_success) {
        $pdo->commit();
        $_SESSION['pesan_sukses'] = "Import data {$type} berhasil. Total " . count($results) . " baris diproses/diperbarui.";
    } else {
        $pdo->rollBack();
        $_SESSION['pesan_error'] = "Import data {$type} GAGAL TOTAL karena ditemukan data yang tidak valid. Silakan cek detail log.";
        $_SESSION['import_log'] = $results; 
    }

} catch (\PhpOffice\PhpSpreadsheet\Reader\Exception $e) {
    $_SESSION['pesan_error'] = "Gagal membaca file Excel. Pastikan format file benar (XLSX/XLS/CSV): " . $e->getMessage();
    if($pdo->inTransaction()) $pdo->rollBack();
} catch (Exception $e) {
    if($pdo->inTransaction()) $pdo->rollBack();
    $_SESSION['pesan_error'] = "Error sistem saat import: " . $e->getMessage();
}

header("Location: " . $redirect_url);
exit;

// =========================================================================================
// == FUNGSI IMPORT SPESIFIK
// =========================================================================================

/**
 * Fungsi baru untuk mengimpor data Pemilih
 * Menggunakan logika pencocokan kelas dari 'siswa.php'
 */
function importPemilih($worksheet, $highestRow, $pdo, $id_tahun_aktif, $kelas_map) {
    $results = [];
    $non_siswa_options = ['Guru', 'Tendik', 'Pegawai', 'Lainnya'];

    for ($row = 2; $row <= $highestRow; $row++) {
        // Kolom A: nis_token, B: nama_lengkap, C: tipe_pemilih, D: keterangan (Nama Kelas atau Jabatan), E: password
        $nis_token = trim($worksheet->getCell('A' . $row)->getFormattedValue());
        $nama_lengkap = trim($worksheet->getCell('B' . $row)->getValue());
        $tipe_pemilih = trim($worksheet->getCell('C' . $row)->getValue());
        $keterangan = trim($worksheet->getCell('D' . $row)->getValue());
        $password = trim($worksheet->getCell('E' . $row)->getFormattedValue());
        
        if (empty($nis_token) && empty($nama_lengkap)) continue;

        if (empty($nis_token) || empty($nama_lengkap) || empty($tipe_pemilih) || empty($keterangan)) {
            $results[] = ['status' => 'error', 'baris' => $row, 'pesan' => 'Data wajib (NIS/Token, Nama, Tipe, Keterangan) tidak lengkap.'];
            continue;
        }
        
        $kelas_id = null;
        $jabatan_non_siswa = null;

        if ($tipe_pemilih === 'Siswa') {
            // Cocokkan nama kelas dengan ID
            $nama_kelas_lower = strtolower($keterangan);
            if (!isset($kelas_map[$nama_kelas_lower])) {
                $results[] = ['status' => 'error', 'baris' => $row, 'pesan' => "Kelas '{$keterangan}' tidak ditemukan di database."];
                continue;
            }
            $kelas_id = $kelas_map[$nama_kelas_lower];
            
        } elseif ($tipe_pemilih === 'Non Siswa') {
            // Cek apakah jabatan valid (opsional, tapi bagus)
            if (!in_array($keterangan, $non_siswa_options)) {
                $results[] = ['status' => 'warning', 'baris' => $row, 'pesan' => "Jabatan '{$keterangan}' tidak standar, tapi tetap diimpor."];
            }
            $jabatan_non_siswa = $keterangan;

        } else {
            $results[] = ['status' => 'error', 'baris' => $row, 'pesan' => "Tipe Pemilih '{$tipe_pemilih}' tidak valid. Gunakan 'Siswa' atau 'Non Siswa'."];
            continue;
        }
        
        // Jika password di Excel kosong, $hashed_password akan jadi NULL
        $hashed_password = !empty($password) ? password_hash($password, PASSWORD_DEFAULT) : null;

        try {
            // Gunakan ON DUPLICATE KEY UPDATE
            $stmt = $pdo->prepare("
                INSERT INTO pemilih (id_tahun_fk, nis_token, nama_lengkap, tipe_pemilih, kelas_id, jabatan_non_siswa, password) 
                VALUES (?, ?, ?, ?, ?, ?, ?)
                ON DUPLICATE KEY UPDATE 
                    nama_lengkap = VALUES(nama_lengkap),
                    tipe_pemilih = VALUES(tipe_pemilih),
                    kelas_id = VALUES(kelas_id),
                    jabatan_non_siswa = VALUES(jabatan_non_siswa),
                    
                    -- === PERBAIKAN 2 (KEAMANAN PASSWORD) ===
                    -- Hanya update password JIKA nilai baru tidak NULL.
                    -- Jika password di Excel kosong (NULL), password lama di DB akan tetap aman.
                    password = IF(VALUES(password) IS NOT NULL, VALUES(password), password)
                    -- ===================================
            ");
            
            $stmt->execute([$id_tahun_aktif, $nis_token, $nama_lengkap, $tipe_pemilih, $kelas_id, $jabatan_non_siswa, $hashed_password]);
            $results[] = ['status' => 'sukses', 'baris' => $row, 'pesan' => 'Data berhasil diimport/diperbarui.'];

        } catch (PDOException $e) {
             if ($e->getCode() == '23000') { // 23000 adalah kode SQL untuk 'Integrity constraint violation'
                 // Pesan ini mungkin sedikit berbeda, tapi biasanya error 1062 (duplicate entry)
                 $results[] = ['status' => 'error', 'baris' => $row, 'pesan' => "Error duplikasi data: NIS/Token '{$nis_token}' sudah ada untuk tahun ini."];
             } else {
                 $results[] = ['status' => 'error', 'baris' => $row, 'pesan' => "Database error: " . $e->getMessage()];
             }
        }
    }
    return $results;
}

?>