<?php
/**
 * API: تقديم طلب وظيفة - job_applications
 * POST /api/job/job-application.php
 * نسخة تكتشف الأعمدة الموجودة تلقائياً
 */

error_reporting(E_ALL);
ini_set('display_errors', 1);

header('Content-Type: application/json; charset=utf-8');
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: POST, OPTIONS');
header('Access-Control-Allow-Headers: Content-Type');

if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
    http_response_code(200);
    exit();
}

if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
    echo json_encode([
        'success' => false,
        'message' => 'طريقة غير مسموح بها'
    ], JSON_UNESCAPED_UNICODE);
    exit();
}

// ============================================
// إعدادات قاعدة البيانات
// ============================================
$host = "localhost";
$dbname = "digitals_autotester_db";
$username = "digitals";
$password = "bassam.bassam";

// ============================================
// قراءة البيانات المرسلة
// ============================================
$inputJSON = file_get_contents('php://input');
$input = json_decode($inputJSON, true);

if (!$input) {
    echo json_encode([
        'success' => false,
        'message' => 'لم يتم إرسال بيانات'
    ], JSON_UNESCAPED_UNICODE);
    exit();
}

// ============================================
// التحقق من الحقول المطلوبة الأساسية فقط
// ============================================
$required_fields = ['fullName', 'email', 'phone', 'jobPosition'];
$missing = [];

foreach ($required_fields as $field) {
    if (empty($input[$field])) {
        $missing[] = $field;
    }
}

if (!empty($missing)) {
    echo json_encode([
        'success' => false,
        'message' => 'الرجاء ملء جميع الحقول المطلوبة',
        'missing_fields' => $missing
    ], JSON_UNESCAPED_UNICODE);
    exit();
}

// ============================================
// التحقق من صحة البيانات الأساسية
// ============================================

if (!preg_match('/^01[0-9]{9}$/', $input['phone'])) {
    echo json_encode([
        'success' => false,
        'message' => 'رقم الهاتف غير صالح - يجب أن يكون 01xxxxxxxxx'
    ], JSON_UNESCAPED_UNICODE);
    exit();
}

if (!filter_var($input['email'], FILTER_VALIDATE_EMAIL)) {
    echo json_encode([
        'success' => false,
        'message' => 'البريد الإلكتروني غير صالح'
    ], JSON_UNESCAPED_UNICODE);
    exit();
}

// ============================================
// الاتصال بقاعدة البيانات
// ============================================
try {
    $pdo = new PDO(
        "mysql:host=$host;dbname=$dbname;charset=utf8mb4",
        $username,
        $password,
        [
            PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
            PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
        ]
    );
} catch(PDOException $e) {
    echo json_encode([
        'success' => false,
        'message' => 'خطأ في الاتصال بقاعدة البيانات'
    ], JSON_UNESCAPED_UNICODE);
    exit();
}

try {
    // ============================================
    // الحصول على أسماء الأعمدة في الجدول
    // ============================================
    $columnsStmt = $pdo->query("SHOW COLUMNS FROM job_applications");
    $columns = [];
    while ($row = $columnsStmt->fetch(PDO::FETCH_ASSOC)) {
        $columns[] = $row['Field'];
    }
    
    // التحقق من وجود أعمدة أساسية
    $hasId = in_array('id', $columns);
    $hasRequestNumber = in_array('request_number', $columns);
    
    // ============================================
    // التحقق من عدم تكرار البريد الإلكتروني أو رقم الهاتف
    // ============================================
    if (in_array('email', $columns) && in_array('phone', $columns)) {
        $checkStmt = $pdo->prepare("SELECT id FROM job_applications WHERE email = ? OR phone = ?");
        $checkStmt->execute([$input['email'], $input['phone']]);
        
        if ($checkStmt->rowCount() > 0) {
            echo json_encode([
                'success' => false,
                'message' => 'البريد الإلكتروني أو رقم الهاتف مسجل مسبقاً'
            ], JSON_UNESCAPED_UNICODE);
            exit();
        }
    }
    
    // ============================================
    // توليد رقم الطلب
    // ============================================
    if ($hasRequestNumber) {
        $requestNumber = 'JOB-' . date('Ymd') . '-' . strtoupper(substr(uniqid(), -6));
        // التأكد من عدم تكرار رقم الطلب
        $checkReq = $pdo->prepare("SELECT id FROM job_applications WHERE request_number = ?");
        $checkReq->execute([$requestNumber]);
        $counter = 1;
        while ($checkReq->rowCount() > 0) {
            $requestNumber = 'JOB-' . date('Ymd') . '-' . strtoupper(substr(uniqid(), -6)) . '-' . $counter;
            $checkReq->execute([$requestNumber]);
            $counter++;
        }
    } else {
        $requestNumber = null;
    }
    
    // ============================================
    // تشفير كلمة المرور (إذا كان العمود موجوداً)
    // ============================================
    $hashedPassword = null;
    if (in_array('password_hash', $columns) && !empty($input['password'])) {
        $hashedPassword = password_hash($input['password'], PASSWORD_DEFAULT);
    }
    
    // ============================================
    // حفظ الملفات (إذا كانت الأعمدة موجودة)
    // ============================================
    $photoPath = null;
    if (in_array('photo_file', $columns) && !empty($input['photo'])) {
        $photoPath = saveBase64File($input['photo'], 'photo', 'photo');
    }
    
    $cvPath = null;
    if (in_array('cv_file', $columns) && !empty($input['cv'])) {
        $cvPath = saveBase64File($input['cv'], 'cv', 'cv');
    }
    
    $idCardPath = null;
    if (in_array('id_card_file', $columns) && !empty($input['idCard'])) {
        $idCardPath = saveBase64File($input['idCard'], 'id_card', 'id_card');
    }
    
    $certificatesJson = null;
    if (in_array('certificates', $columns) && !empty($input['certificates']) && is_array($input['certificates'])) {
        $certsPaths = [];
        foreach ($input['certificates'] as $cert) {
            if (!empty($cert['data']) && !empty($cert['name'])) {
                $path = saveBase64File($cert['data'], $cert['name'], 'certificates');
                if ($path) {
                    $certsPaths[] = $path;
                }
            }
        }
        if (!empty($certsPaths)) {
            $certificatesJson = json_encode($certsPaths, JSON_UNESCAPED_UNICODE);
        }
    }
    
    // ============================================
    // بناء استعلام INSERT بناءً على الأعمدة الموجودة
    // ============================================
    $insertFields = [];
    $placeholders = [];
    $params = [];
    
    // خريطة الحقول الممكنة
    $fieldMappings = [
        'request_number' => $requestNumber,
        'full_name' => trim($input['fullName']),
        'email' => trim($input['email']),
        'phone' => trim($input['phone']),
        'backup_phone' => isset($input['backupPhone']) ? trim($input['backupPhone']) : null,
        'birth_date' => isset($input['birthDate']) ? $input['birthDate'] : null,
        'gender' => isset($input['gender']) ? $input['gender'] : null,
        'governorate' => isset($input['governorate']) ? $input['governorate'] : null,
        'city' => isset($input['city']) ? trim($input['city']) : null,
        'address' => isset($input['address']) ? trim($input['address']) : null,
        'password_hash' => $hashedPassword,
        'job_position' => $input['jobPosition'],
        'qualification' => isset($input['qualification']) ? $input['qualification'] : null,
        'major' => isset($input['major']) ? trim($input['major']) : null,
        'graduation_year' => isset($input['graduationYear']) ? $input['graduationYear'] : null,
        'experience_years' => isset($input['experienceYears']) ? intval($input['experienceYears']) : null,
        'previous_experience' => isset($input['previousExperience']) ? trim($input['previousExperience']) : null,
        'skills' => isset($input['skills']) ? trim($input['skills']) : null,
        'motivation' => isset($input['motivation']) ? trim($input['motivation']) : null,
        'photo_file' => $photoPath,
        'cv_file' => $cvPath,
        'id_card_file' => $idCardPath,
        'certificates' => $certificatesJson,
        'status' => 'pending'
    ];
    
    // إضافة created_at إذا كان موجوداً
    if (in_array('created_at', $columns)) {
        $fieldMappings['created_at'] = date('Y-m-d H:i:s');
    }
    
    // إضافة الأعمدة الموجودة فقط
    foreach ($fieldMappings as $column => $value) {
        if (in_array($column, $columns) && $value !== null) {
            $insertFields[] = $column;
            $placeholders[] = ":$column";
            $params[":$column"] = $value;
        }
    }
    
    // إذا لم يكن هناك حقول للإدراج، أعد خطأ
    if (empty($insertFields)) {
        echo json_encode([
            'success' => false,
            'message' => 'لا توجد أعمدة متاحة للإدراج في قاعدة البيانات'
        ], JSON_UNESCAPED_UNICODE);
        exit();
    }
    
    // تنفيذ الاستعلام
    $sql = "INSERT INTO job_applications (" . implode(', ', $insertFields) . ") VALUES (" . implode(', ', $placeholders) . ")";
    $insertStmt = $pdo->prepare($sql);
    $insertStmt->execute($params);
    
    // الحصول على آخر ID تم إدراجه
    $lastId = $pdo->lastInsertId();
    
    // توليد رقم الطلب من ID إذا لم يكن هناك request_number
    if (!$requestNumber && $hasId) {
        $requestNumber = 'JOB-' . date('Ymd') . '-' . str_pad($lastId, 6, '0', STR_PAD_LEFT);
    } elseif (!$requestNumber) {
        $requestNumber = 'JOB-' . date('Ymd') . '-' . strtoupper(substr(uniqid(), -6));
    }
    
    // إرجاع استجابة النجاح
    echo json_encode([
        'success' => true,
        'message' => 'تم تسجيل طلب التوظيف بنجاح',
        'data' => [
            'id' => $lastId,
            'request_number' => $requestNumber,
            'full_name' => trim($input['fullName']),
            'email' => trim($input['email']),
            'phone' => trim($input['phone']),
            'job_position' => $input['jobPosition'],
            'status' => 'pending'
        ]
    ], JSON_UNESCAPED_UNICODE);
    
} catch(PDOException $e) {
    error_log("Database error: " . $e->getMessage());
    echo json_encode([
        'success' => false,
        'message' => 'خطأ في قاعدة البيانات: ' . $e->getMessage()
    ], JSON_UNESCAPED_UNICODE);
} catch(Exception $e) {
    error_log("General error: " . $e->getMessage());
    echo json_encode([
        'success' => false,
        'message' => 'حدث خطأ غير متوقع: ' . $e->getMessage()
    ], JSON_UNESCAPED_UNICODE);
}

// ============================================
// الدوال المساعدة
// ============================================

function saveBase64File($base64Data, $originalName, $type = 'file') {
    if (empty($base64Data)) return null;
    
    try {
        $data = explode(',', $base64Data);
        if (count($data) < 2) return null;
        
        $fileData = base64_decode($data[1]);
        if ($fileData === false) return null;
        
        $extension = 'file';
        if (strpos($data[0], 'pdf') !== false) {
            $extension = 'pdf';
        } elseif (strpos($data[0], 'png') !== false) {
            $extension = 'png';
        } elseif (strpos($data[0], 'jpeg') !== false || strpos($data[0], 'jpg') !== false) {
            $extension = 'jpg';
        } elseif (strpos($data[0], 'msword') !== false) {
            $extension = 'doc';
        } elseif (strpos($data[0], 'wordprocessingml') !== false) {
            $extension = 'docx';
        } else {
            $originalExtension = pathinfo($originalName, PATHINFO_EXTENSION);
            if ($originalExtension) {
                $extension = $originalExtension;
            }
        }
        
        $filename = $type . '_' . date('Ymd_His') . '_' . rand(1000, 9999) . '.' . $extension;
        $uploadDir = __DIR__ . '/../../uploads/job_applications/' . $type . '/';
        
        if (!is_dir($uploadDir)) {
            mkdir($uploadDir, 0777, true);
        }
        
        $fullPath = $uploadDir . $filename;
        file_put_contents($fullPath, $fileData);
        
        return 'uploads/job_applications/' . $type . '/' . $filename;
        
    } catch (Exception $e) {
        error_log("File save error: " . $e->getMessage());
        return null;
    }
}
?>