<?php
// api/update_profile.php

header('Content-Type: application/json'); // Memberi tahu browser bahwa respons adalah JSON
require_once 'db_connect.php'; // Koneksi database Anda
session_start(); // Mulai sesi untuk mengakses $_SESSION['user_id']

// Izinkan CORS (Cross-Origin Resource Sharing) untuk pengembangan
// DI LINGKUNGAN PRODUKSI, UBAH '*' MENJADI DOMAIN APLIKASI ANDA!
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: POST, OPTIONS');
header('Access-Control-Allow-Headers: Content-Type, Authorization');

// Tangani preflight request OPTIONS dari browser
if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
    http_response_code(200);
    exit();
}

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    // Periksa apakah user sudah login
    if (!isset($_SESSION['user_id'])) {
        echo json_encode(['success' => false, 'message' => 'Anda harus login untuk memperbarui profil.']);
        exit();
    }

    $userId = $_SESSION['user_id']; // Ambil ID pengguna dari sesi

    // Ambil data dari $_POST (FormData dikirim melalui $_POST, bukan php://input)
    $full_name = $_POST['full_name'] ?? null;
    $phone_number = $_POST['phone_number'] ?? null;
    $address = $_POST['address'] ?? null;
    $village = $_POST['village'] ?? null;
    $rt = $_POST['rt'] ?? null;
    $rw = $_POST['rw'] ?? null;
    $coordinates = $_POST['coordinates'] ?? null;
    $date_of_birth = $_POST['date_of_birth'] ?? null; // Akan berupa YYYY-MM-DD dari input type="date"
    $nik = $_POST['nik'] ?? null; // NIK sekarang akan diambil dari POST

    $profile_picture_url = null; // Default: tidak ada perubahan gambar

    try {
        $pdo->beginTransaction(); // Mulai transaksi database

        // --- 1. Tangani Upload Gambar Profil (Jika Ada) ---
        if (isset($_FILES['profile_picture']) && $_FILES['profile_picture']['error'] === UPLOAD_ERR_OK) {
            $file = $_FILES['profile_picture'];
            $fileName = $file['name'];
            $fileTmpName = $file['tmp_name'];
            $fileSize = $file['size'];
            $fileError = $file['error'];
            $fileType = $file['type'];

            $fileExt = strtolower(pathinfo($fileName, PATHINFO_EXTENSION));
            $allowedExtensions = ['jpg', 'jpeg', 'png', 'gif']; // Ekstensi file yang diizinkan

            if (in_array($fileExt, $allowedExtensions)) {
                if ($fileError === 0) {
                    if ($fileSize < 5000000) { // Maksimal 5MB (5 * 1024 * 1024 bytes)
                        // Buat nama file unik untuk menghindari tabrakan
                        $newFileName = uniqid('profile_', true) . "." . $fileExt;
                        // Path lengkap untuk menyimpan file di server
                        $uploadDir = '../uploads/profile_pictures/'; // Relatif terhadap lokasi API file ini
                        $uploadPath = $uploadDir . $newFileName;
                        // Path yang akan disimpan di database (relatif terhadap root aplikasi web)
                        $dbPath = 'uploads/profile_pictures/' . $newFileName;

                        // Pastikan direktori tujuan ada, buat jika belum ada
                        if (!is_dir($uploadDir)) {
                            mkdir($uploadDir, 0755, true); // 0755 untuk izin baca/tulis/eksekusi untuk owner, baca/eksekusi untuk grup dan lainnya
                        }

                        // Pindahkan file yang diupload dari direktori sementara
                        if (move_uploaded_file($fileTmpName, $uploadPath)) {
                            $profile_picture_url = $dbPath;

                            // Hapus gambar profil lama jika ada
                            $stmt = $pdo->prepare("SELECT profile_picture_url FROM users WHERE id = :id");
                            $stmt->execute([':id' => $userId]);
                            $oldProfilePicPath = $stmt->fetchColumn();

                            if ($oldProfilePicPath && file_exists('../' . $oldProfilePicPath)) {
                                // Pastikan file lama bukan placeholder default atau file penting lainnya
                                if (strpos($oldProfilePicPath, 'uploads/profile_pictures/') !== false) { // Hanya hapus jika di folder kita
                                    unlink('../' . $oldProfilePicPath);
                                }
                            }
                        } else {
                            throw new Exception("Gagal mengunggah file gambar. Periksa izin folder.");
                        }
                    } else {
                        throw new Exception("Ukuran gambar terlalu besar. Maksimal 5MB.");
                    }
                } else {
                    throw new Exception("Terjadi kesalahan saat mengunggah gambar. Kode error: " . $fileError);
                }
            } else {
                throw new Exception("Jenis file gambar tidak diizinkan. Gunakan JPG, JPEG, PNG, atau GIF.");
            }
        }

        // --- 2. Bangun Query Update Database ---
        $setClauses = [];
        $params = [':id' => $userId];

        // Tambahkan ke klausa SET hanya jika data ada (tidak null)
        if ($full_name !== null) { $setClauses[] = 'full_name = :full_name'; $params[':full_name'] = $full_name; }
        if ($phone_number !== null) {
            // Validasi format nomor telepon sederhana (misal: dimulai dengan 62 dan angka)
            if (!preg_match('/^62[0-9]{8,15}$/', $phone_number)) { // Contoh: 62xxxxxxxxx
                throw new Exception('Format Nomor HP/WA tidak valid. Gunakan format 62xxxxxxxxxx.');
            }
            $setClauses[] = 'phone_number = :phone_number'; $params[':phone_number'] = $phone_number;
        }
        if ($address !== null) { $setClauses[] = 'address = :address'; $params[':address'] = $address; }
        if ($village !== null) { $setClauses[] = 'village = :village'; $params[':village'] = $village; }
        if ($rt !== null) { $setClauses[] = 'rt = :rt'; $params[':rt'] = $rt; }
        if ($rw !== null) { $setClauses[] = 'rw = :rw'; $params[':rw'] = $rw; }
        if ($coordinates !== null) { $setClauses[] = 'coordinates = :coordinates'; $params[':coordinates'] = $coordinates; }
        
        // Tangani tanggal lahir
        if ($date_of_birth !== null && !empty($date_of_birth)) {
            // date_of_birth dari input type="date" sudah dalam format YYYY-MM-DD
            if (!preg_match('/^\d{4}-\d{2}-\d{2}$/', $date_of_birth)) {
                throw new Exception("Format tanggal lahir tidak valid. Gunakan YYYY-MM-DD.");
            }
            $setClauses[] = 'date_of_birth = :date_of_birth';
            $params[':date_of_birth'] = $date_of_birth;
        } else {
            // Jika dikosongkan dari frontend, set ke null di DB
            $setClauses[] = 'date_of_birth = :date_of_birth'; 
            $params[':date_of_birth'] = null;
        }

        // --- AKTIFKAN KEMBALI BARIS INI UNTUK UPDATE NIK ---
        if ($nik !== null) {
            // Anda bisa menambahkan validasi NIK di sini
            // Contoh validasi sederhana: harus 16 digit angka
            if (!preg_match('/^[0-9]{16}$/', $nik)) {
                 throw new Exception('Format NIK tidak valid. Harus 16 digit angka.');
            }
            $setClauses[] = 'nik = :nik';
            $params[':nik'] = $nik;
        }

        if ($profile_picture_url !== null) {
            $setClauses[] = 'profile_picture_url = :profile_picture_url';
            $params[':profile_picture_url'] = $profile_picture_url;
        }

        // Jika tidak ada data yang dikirim untuk diupdate (termasuk gambar baru)
        if (empty($setClauses)) {
            $pdo->rollBack(); // Tidak perlu commit jika tidak ada perubahan
            echo json_encode(['success' => false, 'message' => 'Tidak ada perubahan yang dikirim.']);
            exit();
        }

        // Eksekusi query update
        $sql = "UPDATE users SET " . implode(', ', $setClauses) . " WHERE id = :id";
        $stmt = $pdo->prepare($sql);
        $stmt->execute($params);

        $pdo->commit(); // Commit transaksi jika semua berhasil

        // Ambil data profil terbaru untuk dikirim kembali ke frontend
        // PASTIKAN SEMUA KOLOM YANG RELEVAN DIPILIH, TERMASUK NIK
        $stmt = $pdo->prepare("SELECT id, full_name, phone_number, address, village, rt, rw, coordinates, date_of_birth, nik, profile_picture_url FROM users WHERE id = :id");
        $stmt->execute([':id' => $userId]);
        $updatedProfile = $stmt->fetch(PDO::FETCH_ASSOC);

        // Format tanggal lahir kembali ke YYYY-MM-DD untuk konsistensi dengan frontend
        if ($updatedProfile['date_of_birth']) {
            $updatedProfile['date_of_birth'] = (new DateTime($updatedProfile['date_of_birth']))->format('Y-m-d');
        } else {
            $updatedProfile['date_of_birth'] = ''; // Pastikan tidak null
        }
        // tambahkan kewarganegaraan statis
        $updatedProfile['kewarganegaraan'] = 'Warga Negara Indonesia';

        $response = [
            'success' => true,
            'message' => 'Profil berhasil diperbarui.',
            'profile' => $updatedProfile // Kirim data profil terbaru
        ];
        // Note: Anda sudah menyertakan `profile_picture_url` di `$updatedProfile['profile_picture_url']`
        // Jadi ini tidak lagi diperlukan unless Anda ingin nama properti berbeda di root response
        // if ($profile_picture_url) {
        //     $response['profile_picture_url'] = $profile_picture_url; // Kirim URL gambar baru
        // }

        echo json_encode($response);

    } catch (Exception $e) {
        $pdo->rollBack(); // Rollback transaksi jika terjadi kesalahan
        error_log("Update profile error: " . $e->getMessage()); // Catat error ke log server
        echo json_encode(['success' => false, 'message' => $e->getMessage()]);
    } catch (\PDOException $e) {
        $pdo->rollBack(); // Rollback transaksi jika terjadi kesalahan PDO
        error_log("Update profile PDO error: " . $e->getMessage());
        // Berikan pesan yang lebih umum ke frontend untuk keamanan
        echo json_encode(['success' => false, 'message' => 'Terjadi kesalahan database saat memperbarui profil.']);
    }
} else {
    // Metode request tidak diizinkan
    echo json_encode(['success' => false, 'message' => 'Metode request tidak diizinkan.']);
}
?>