<?php
require_once '../../includes/functions.php';
require_once '../../includes/validation.php';
requireAdmin();

if ($_SERVER['REQUEST_METHOD'] !== 'POST' || !isset($_FILES['file_excel'])) {
    header('Location: list.php?error=No file uploaded');
    exit;
}

// Cek apakah file berhasil diupload
if ($_FILES['file_excel']['error'] !== UPLOAD_ERR_OK) {
    header('Location: list.php?error=Gagal upload file. Kode error: ' . $_FILES['file_excel']['error']);
    exit;
}

// Validasi ekstensi file
$fileName = $_FILES['file_excel']['name'];
$fileExt = strtolower(pathinfo($fileName, PATHINFO_EXTENSION));
if (!in_array($fileExt, ['xlsx', 'xls'])) {
    header('Location: list.php?error=Format file tidak valid. Harap upload file Excel (.xlsx atau .xls)');
    exit;
}

// Fungsi sederhana untuk membaca CSV (alternatif jika Excel tidak bisa dibaca)
// Untuk Excel, kita akan menggunakan metode sederhana dengan mengkonversi ke CSV dulu

$successCount = 0;
$errorCount = 0;
$errors = [];
$updateIfExists = isset($_POST['update_if_exists']);

// Buka file upload
$tmpFile = $_FILES['file_excel']['tmp_name'];

// Coba baca sebagai CSV (dengan asumsi user bisa menyimpan sebagai CSV)
// Untuk kemudahan, kita akan membaca baris per baris
if (($handle = fopen($tmpFile, "r")) !== FALSE) {
    // Baca header (skip baris pertama)
    $header = fgetcsv($handle);
    
    $rowNumber = 1;
    global $pdo;
    
    while (($data = fgetcsv($handle)) !== FALSE) {
        $rowNumber++;
        
        // Skip jika baris kosong
        if (empty(array_filter($data))) continue;
        
        // Pastikan minimal ada 7 kolom
        if (count($data) < 7) {
            $errors[] = "Baris $rowNumber: Jumlah kolom tidak lengkap";
            $errorCount++;
            continue;
        }
        
        // Ambil data dari CSV
        $nip = trim($data[0] ?? '');
        $nama = trim($data[1] ?? '');
        $jenis_kelamin = strtoupper(trim($data[2] ?? ''));
        $tempat_lahir = trim($data[3] ?? '');
        $tanggal_lahir_raw = trim($data[4] ?? '');
        $pendidikan = trim($data[5] ?? '');
        $status = strtolower(trim($data[6] ?? 'aktif'));
        
        // Validasi data wajib
        $rowErrors = [];
        
        if (empty($nip)) {
            $rowErrors[] = "NIP wajib diisi";
        }
        
        if (empty($nama)) {
            $rowErrors[] = "Nama Lengkap wajib diisi";
        }
        
        if (empty($jenis_kelamin) || !in_array($jenis_kelamin, ['L', 'P'])) {
            $rowErrors[] = "Jenis Kelamin harus L atau P";
        }
        
        // Validasi tanggal lahir jika ada
        $tanggal_lahir = null;
        if (!empty($tanggal_lahir_raw)) {
            $tanggal = date_create($tanggal_lahir_raw);
            if ($tanggal) {
                $tanggal_lahir = $tanggal->format('Y-m-d');
            } else {
                $rowErrors[] = "Format Tanggal Lahir tidak valid (gunakan YYYY-MM-DD)";
            }
        }
        
        // Validasi status
        if (!in_array($status, ['aktif', 'tidak_aktif'])) {
            $status = 'aktif';
        }
        
        // Jika ada error, skip baris ini
        if (!empty($rowErrors)) {
            $errors[] = "Baris $rowNumber: " . implode(', ', $rowErrors);
            $errorCount++;
            continue;
        }
        
        // Mulai transaksi untuk setiap baris
        $pdo->beginTransaction();
        
        try {
            // Cek apakah guru sudah ada berdasarkan NIP
            $existingGuru = db_fetch("SELECT * FROM guru WHERE nip = ?", [$nip]);
            
            if ($existingGuru && !$updateIfExists) {
                // Skip jika tidak diizinkan update
                $errors[] = "Baris $rowNumber: NIP $nip sudah ada (skip)";
                $errorCount++;
                $pdo->rollBack();
                continue;
            }
            
            // Buat username dari nama
            $baseUsername = strtolower(preg_replace('/[^a-zA-Z0-9]/', '', $nama));
            $username = $baseUsername . rand(100, 999);
            
            // Pastikan username unik
            while (db_fetch("SELECT id FROM users WHERE username = ?", [$username])) {
                $username = $baseUsername . rand(100, 999);
            }
            
            if ($existingGuru) {
                // UPDATE DATA GURU YANG SUDAH ADA
                
                // Update data guru
                db_update('guru', [
                    'nama' => $nama,
                    'jenis_kelamin' => $jenis_kelamin,
                    'tempat_lahir' => $tempat_lahir,
                    'tanggal_lahir' => $tanggal_lahir,
                    'pendidikan' => $pendidikan,
                    'status' => $status,
                    'updated_at' => date('Y-m-d H:i:s')
                ], 'id = ?', [$existingGuru['id']]);
                
                // Cek apakah user account sudah ada
                $existingUser = db_fetch("SELECT * FROM users WHERE guru_id = ?", [$existingGuru['id']]);
                
                if ($existingUser) {
                    // Update user yang ada
                    db_update('users', [
                        'nama_lengkap' => $nama,
                        'status' => $status,
                        'updated_at' => date('Y-m-d H:i:s')
                    ], 'id = ?', [$existingUser['id']]);
                } else {
                    // Buat user baru jika belum ada
                    db_insert('users', [
                        'username' => $username,
                        'password' => password_hash($nip, PASSWORD_DEFAULT),
                        'nama_lengkap' => $nama,
                        'role' => 'guru',
                        'guru_id' => $existingGuru['id'],
                        'status' => $status,
                        'created_at' => date('Y-m-d H:i:s')
                    ]);
                }
                
            } else {
                // INSERT DATA GURU BARU
                
                // Insert ke tabel guru
                $guruId = db_insert('guru', [
                    'nip' => $nip,
                    'nama' => $nama,
                    'jenis_kelamin' => $jenis_kelamin,
                    'tempat_lahir' => $tempat_lahir,
                    'tanggal_lahir' => $tanggal_lahir,
                    'pendidikan' => $pendidikan,
                    'status' => $status,
                    'created_at' => date('Y-m-d H:i:s')
                ]);
                
                // Insert ke tabel users
                db_insert('users', [
                    'username' => $username,
                    'password' => password_hash($nip, PASSWORD_DEFAULT),
                    'nama_lengkap' => $nama,
                    'role' => 'guru',
                    'guru_id' => $guruId,
                    'status' => $status,
                    'created_at' => date('Y-m-d H:i:s')
                ]);
            }
            
            $pdo->commit();
            $successCount++;
            
        } catch (Exception $e) {
            $pdo->rollBack();
            $errors[] = "Baris $rowNumber: Error - " . $e->getMessage();
            $errorCount++;
        }
    }
    
    fclose($handle);
    
    // Buat pesan hasil import
    $message = "Berhasil import $successCount data guru";
    if ($errorCount > 0) {
        $message .= ", $errorCount data gagal";
    }
    
    // Redirect dengan pesan
    if ($errorCount > 0) {
        $errorMessage = $message . ". " . implode('; ', array_slice($errors, 0, 5));
        if (count($errors) > 5) {
            $errorMessage .= " dan " . (count($errors) - 5) . " error lainnya";
        }
        header('Location: list.php?error=' . urlencode($errorMessage));
    } else {
        header('Location: list.php?success=' . urlencode($message));
    }
    
} else {
    header('Location: list.php?error=' . urlencode('Gagal membaca file'));
}
?>