<?php
// admin/api/export_csv.php — Xuất CSV danh sách hồ sơ xét tuyển
require_once __DIR__ . '/_guard.php';
require_once __DIR__ . '/../../lib/RateLimiter.php';

// Kiểm tra Rate Limit: Cấm xuất file liên tục (Tối đa 5 lần mỗi 30 phút = 1800 giây)
if (!RateLimiter::checkSessionLimit('export_csv', 5, 1800)) {
    header('Content-Type: application/json; charset=utf-8');
    echo json_encode(['status' => 'error', 'message' => 'Bạn đã xuất file quá 5 lần trong 30 phút. Vui lòng thử lại sau để bảo vệ máy chủ.']);
    exit;
}

try {
    $supabaseAdmin = new DatabaseClient('service');
    
    // 1. Lấy dữ liệu từ Supabase (có phân trang để tải toàn bộ, vượt giới hạn 1000 dòng của API)
    $applications = [];
    $offset = 0;
    $limit = 1000;
    
    while (true) {
        $query = "select=*,admission_periods(name),majors(major_code,major_name,education_levels(name)),admission_methods(method_name,application_fee)&order=submitted_at.asc&limit={$limit}&offset={$offset}";
        $appsRes = $supabaseAdmin->select('applications', $query);
        
        if ($appsRes['code'] != 200) {
            throw new Exception("Lỗi khi lấy dữ liệu applications: " . json_encode($appsRes['data'] ?? []));
        }
        
        $batch = $appsRes['data'];
        if (empty($batch)) break;
        
        $applications = array_merge($applications, $batch);
        $offset += $limit;
        
        if (count($batch) < $limit) break;
    }

    // Lấy Profile để map thông tin user
    $userProfilesMap = $supabaseAdmin->fetchUserProfilesMap(
        array_column($applications, 'user_id'),
        'id,full_name,identity_card,phone_number,contact_email,date_of_birth,gender,ethnicity,province,ward,address_detail,school_name,school_province,school_ward,priority_area,priority_object,graduation_year,academic_performance,conduct'
    );
    
    $filename = 'Danh_sach_Hoso_' . date('Y_m_d_His') . '.csv';
    $exportDir = __DIR__ . '/../../uploads/exports';
    if (!is_dir($exportDir)) {
        mkdir($exportDir, 0777, true);
    }
    
    // Xoá file csv cũ hơn 1 ngày
    foreach (glob($exportDir . '/*.csv') as $file) {
        if (is_file($file) && time() - filemtime($file) >= 86400) {
            unlink($file);
        }
    }

    $filepath = $exportDir . '/' . $filename;
    $fileUrl = BASE_URL . '/uploads/exports/' . $filename; 

    // Xuất BOM cho UTF-8 Excel
    $output = fopen($filepath, 'w');
    fputs($output, chr(0xEF) . chr(0xBB) . chr(0xBF)); // BOM

    $headers = [
        'STT', 'Trạng thái HS', 'Họ tên', 'Ngày sinh', 'Giới tính', 'CMND/CCCD', 
        'Dân tộc', 'Số điện thoại', 'Email liên lạc', 'Địa chỉ', 'Tỉnh/TP', 'Quận/Huyện', 
        'Trường THPT', 'Xã/phường trường', 'Tỉnh trường', 'Năm tốt nghiệp', 
        'Học lực', 'Hạnh kiểm', 'KV ưu tiên', 'ĐT ưu tiên', 'Hệ đào tạo', 
        'Ngành đăng ký', 'Mã ngành', 'ID Ngành', 'Phương thức xét tuyển', 'Mã PTXT', 
        'Nguyện vọng', 'Kỳ tuyển sinh', 'Mã Đợt TS', 'Lệ phí', 'Trạng thái TT', 'Mã chuyển khoản',
        'Ghi chú', 'Link biên lai', 'Mã hồ sơ (Hệ thống)', 'Ngày nộp',
        'Bậc ĐT đã tốt nghiệp', 'Ngành đã TN', 'Ngày nhập học', 'Ngày tốt nghiệp', 'Xếp loại TN',
        'Trường cấp bằng', 'Ngày cấp bằng', 'Chức vụ hiện tại', 'Nơi công tác'
    ];
    fputcsv($output, $headers, ';');

    $stt = 1;
    foreach ($applications as $app) {
        $user = $userProfilesMap[$app['user_id']] ?? [];
        $majorName = $app['majors']['major_name'] ?? '';
        $majorCode = $app['majors']['major_code'] ?? '';
        $levelName = $app['majors']['education_levels']['name'] ?? '';
        $methodName = $app['admission_methods']['method_name'] ?? '';
        $feeAmount = $app['admission_methods']['application_fee'] ?? $app['fee_amount'] ?? 0;
        $periodName = $app['admission_periods']['name'] ?? '';
        
        $dob = !empty($user['date_of_birth']) ? '="' . date('d/m/Y', strtotime($user['date_of_birth'])) . '"' : '';
        $genderText = $user['gender'] ?? '';
        $cmnd = '="' . ($user['identity_card'] ?? '') . '"';
        $phone = '="' . ($user['phone_number'] ?? '') . '"';
        $appIdStr = '="' . ($app['id'] ?? '') . '"';
        $statusText = $app['status'] == 'APPROVED' ? 'Hợp lệ' : ($app['status'] == 'REJECTED' ? 'Từ chối' : 'Chờ duyệt');
        $paymentText = ($app['payment_status'] ?? '') == 'PAID' ? 'Đã TT' : 'Chưa TT';

        $periodId = $app['admission_period_id'] ?? '';
        $majorId = $app['major_id'] ?? '';
        $methodId = $app['admission_method_id'] ?? '';
        $cccdClean = preg_replace('/\D/', '', $user['identity_card'] ?? '');
        $pId = str_pad($periodId, 2, '0', STR_PAD_LEFT);
        $mId = str_pad($majorId, 3, '0', STR_PAD_LEFT);
        $ptId = str_pad($methodId, 2, '0', STR_PAD_LEFT);
        $transferCode = "TS{$pId}M{$mId}PT{$ptId} {$cccdClean}";

        // Formatting dates for new fields
        $prev_adm_date = !empty($user['prev_admission_date']) ? '="' . date('d/m/Y', strtotime($user['prev_admission_date'])) . '"' : '';
        $prev_grad_date = !empty($user['prev_graduation_date']) ? '="' . date('d/m/Y', strtotime($user['prev_graduation_date'])) . '"' : '';
        $prev_dip_date = !empty($user['prev_diploma_date']) ? '="' . date('d/m/Y', strtotime($user['prev_diploma_date'])) . '"' : '';

        $row = [
            $stt++, $statusText, $user['full_name'] ?? '', $dob, $genderText,
            $cmnd, $user['ethnicity'] ?? '', $phone,
            $user['contact_email'] ?? '', $user['address_detail'] ?? '',
            $user['province'] ?? '', $user['ward'] ?? '',
            $user['school_name'] ?? '', $user['school_ward'] ?? '', $user['school_province'] ?? '',
            $user['graduation_year'] ?? '', $user['academic_performance'] ?? '',
            $user['conduct'] ?? '', $user['priority_area'] ?? '',
            $user['priority_object'] ?? '', $levelName, $majorName,
            $majorCode, $majorId, $methodName, $methodId,
            $app['priority'] ?? 1, $periodName, $periodId, $feeAmount, $paymentText, $transferCode,
            $app['admin_notes'] ?? '', $app['receipt_url'] ?? '', $appIdStr,
            '="' . date('d/m/Y H:i', strtotime($app['submitted_at'])) . '"',
            $user['prev_degree_level'] ?? '', $user['prev_major'] ?? '', $prev_adm_date,
            $prev_grad_date, $user['prev_graduation_rank'] ?? '', $user['prev_diploma_school'] ?? '',
            $prev_dip_date, $user['current_position'] ?? '', $user['current_workplace'] ?? ''
        ];
        $row = array_map(function($val) {
            if (is_string($val) && preg_match('/^=".*"$/', $val)) return $val;
            if (in_array(substr((string)$val, 0, 1), ['=', '+', '-', '@'])) return "'" . $val;
            return $val;
        }, $row);
        fputcsv($output, $row, ';');
    }

    fclose($output);

    if (ob_get_level()) ob_end_clean();
    header('Content-Type: application/json; charset=utf-8');
    echo json_encode(['status' => 'success', 'filename' => $filename, 'file_url' => $fileUrl]);
    exit;

} catch (Exception $e) {
    if (ob_get_level()) ob_end_clean();
    header('Content-Type: application/json; charset=utf-8');
    echo json_encode(['status' => 'error', 'message' => $e->getMessage()]);
    exit;
}
