<?php
// admin/api/export_sheets.php — Xuất dữ liệu lên Google Sheets
require_once __DIR__ . '/_guard.php';
require_once __DIR__ . '/../../lib/RateLimiter.php';

header('Content-Type: application/json; charset=utf-8');

// Kiểm tra Rate Limit: Cấm xuất Google Sheets liên tục (Tối đa 5 lần mỗi 30 phút = 1800 giây)
if (!RateLimiter::checkSessionLimit('export_sheets', 5, 1800)) {
    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;
}

$autoloadPath = __DIR__ . '/../../vendor/autoload.php';
if (!file_exists($autoloadPath)) {
    echo json_encode(['status' => 'error', 'message' => 'Thư viện Google API chưa được cài đặt (thiếu vendor/autoload.php).']);
    exit;
}
require_once $autoloadPath;

try {
    $supabaseAdmin = new DatabaseClient('service');
    
    // 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;
    }

    $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,prev_degree_level,prev_major,prev_admission_date,prev_graduation_date,prev_graduation_rank,prev_diploma_school,prev_diploma_date,current_position,current_workplace'
    );

    // Headers
    $values = [];
    $values[] = [
        'STT', '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', 'Ngày nộp hồ sơ', 'Kỳ tuyển sinh', 'Mã Đợt TS', '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', 'Lệ phí (VNĐ)',
        'Trạng thái hồ sơ', 'Trạng thái thanh toán', 'Mã chuyển khoản', 'Ghi chú admin', 'Link biên lai',
        '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'
    ];

    $stt = 1;
    foreach ($applications as $app) {
        $user = $userProfilesMap[$app['user_id']] ?? [];
        $dob = !empty($user['date_of_birth']) ? "'" . date('d/m/Y', strtotime($user['date_of_birth'])) : '';
        $genderText = $user['gender'] ?? '';
        $statusText = $app['status'] == 'APPROVED' ? 'Hợp lệ' : ($app['status'] == 'REJECTED' ? 'Từ chối' : 'Chờ duyệt');
        $paymentText = $app['payment_status'] == 'PAID' ? 'Đã thanh toán' : ($app['payment_status'] == 'REFUNDED' ? 'Đã hoàn tiền' : 'Chưa thanh toán');
        $cmndStr = isset($user['identity_card']) && $user['identity_card'] !== '' ? "'" . $user['identity_card'] : '';
        $phoneStr = isset($user['phone_number']) && $user['phone_number'] !== '' ? "'" . $user['phone_number'] : '';

        $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++,
            $user['full_name'] ?? '', $dob, $genderText,
            $cmndStr, $user['ethnicity'] ?? '',
            $phoneStr, $user['contact_email'] ?? '',
            trim($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'] ?? '',
            "'" . date('d/m/Y H:i', strtotime($app['submitted_at'])),
            $app['admission_periods']['name'] ?? '', $periodId,
            $app['majors']['education_levels']['name'] ?? '',
            $app['majors']['major_name'] ?? '', $app['majors']['major_code'] ?? '', $majorId,
            $app['admission_methods']['method_name'] ?? '', $methodId,
            $app['priority'] ?? 1,
            $app['admission_methods']['application_fee'] ?? $app['fee_amount'] ?? 0,
            $statusText, $paymentText, $transferCode, $app['admin_notes'] ?? '',
            $app['receipt_url'] ?? '',
            $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 (in_array(substr((string)$val, 0, 1), ['=', '+', '-', '@'])) return "'" . $val;
            return $val;
        }, $row);
        $values[] = $row;
    }

    // Google Sheets API
    $keyFilePath = __DIR__ . '/../../key.json';
    if (!file_exists($keyFilePath)) {
        throw new Exception("Không tìm thấy file credentials cấu hình Google API.");
    }

    $client = new \Google\Client();
    $client->setAuthConfig($keyFilePath);
    $client->addScope(\Google\Service\Sheets::SPREADSHEETS);
    
    $service = new \Google\Service\Sheets($client);
    $spreadsheetId = '1ZpSU3B2rTuzOz4kFcIoaHV4uThaUChHqtkKRuakwl2E'; // Cập nhật sang ID mới

    $spreadsheetInfo = $service->spreadsheets->get($spreadsheetId);
    $firstSheetTitle = $spreadsheetInfo->getSheets()[0]->getProperties()->getTitle();

    // Clear + Update
    $service->spreadsheets_values->clear($spreadsheetId, $firstSheetTitle, new \Google\Service\Sheets\ClearValuesRequest());
    
    $valueRange = new \Google\Service\Sheets\ValueRange();
    $valueRange->setValues($values);

    $result = $service->spreadsheets_values->update(
        $spreadsheetId, $firstSheetTitle,
        $valueRange,
        ['valueInputOption' => 'USER_ENTERED']
    );

    echo json_encode([
        'status' => 'success', 
        'message' => 'Đã xuất dữ liệu', 
        'updatedRows' => $result->getUpdatedCells(),
        'sheetUrl' => 'https://docs.google.com/spreadsheets/d/' . $spreadsheetId . '/edit'
    ]);

} catch (Exception $e) {
    error_log("Google Sheets Export Error: " . $e->getMessage());
    echo json_encode(['status' => 'error', 'message' => $e->getMessage()]);
}
