<?php
/**
 * ملف استقبال طلبات الفحص الجديدة
 * المسار: /api/client/endpoints/submit_request.php
 */

// إعدادات CORS والأمان
header('Content-Type: application/json');
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: POST, GET, OPTIONS');
header('Access-Control-Allow-Headers: Content-Type, Authorization, X-Requested-With');

// معالجة طلب OPTIONS (preflight)
if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
    http_response_code(200);
    exit();
}

// التحقق من طريقة الطلب
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
    http_response_code(405);
    echo json_encode([
        'success' => false,
        'message' => 'Method not allowed. Please use POST method.'
    ]);
    exit();
}

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

// التحقق من وجود بيانات
if (!$input || empty($input)) {
    http_response_code(400);
    echo json_encode([
        'success' => false,
        'message' => 'لم يتم إرسال أي بيانات. يرجى التأكد من صحة البيانات المرسلة.'
    ]);
    exit();
}

// الحقول المطلوبة
$requiredFields = ['fullName', 'phone', 'email', 'city', 'carBrand', 'carModel', 'carYear', 'serviceType', 'serviceName', 'servicePrice'];
$missingFields = [];

foreach ($requiredFields as $field) {
    if (empty($input[$field])) {
        $missingFields[] = $field;
    }
}

if (!empty($missingFields)) {
    http_response_code(400);
    echo json_encode([
        'success' => false,
        'message' => 'بعض الحقول المطلوبة غير موجودة: ' . implode(', ', $missingFields)
    ]);
    exit();
}

// تنظيف البيانات
$fullName = trim(strip_tags($input['fullName']));
$phone = trim(strip_tags($input['phone']));
$email = trim(strip_tags($input['email']));
$city = trim(strip_tags($input['city']));
$carBrand = trim(strip_tags($input['carBrand']));
$carModel = trim(strip_tags($input['carModel']));
$carYear = intval($input['carYear']);
$carColor = isset($input['carColor']) ? trim(strip_tags($input['carColor'])) : '';
$plateNumber = isset($input['plateNumber']) ? trim(strip_tags($input['plateNumber'])) : '';
$serviceType = trim(strip_tags($input['serviceType']));
$serviceName = trim(strip_tags($input['serviceName']));
$servicePrice = floatval($input['servicePrice']);
$advanceAmount = isset($input['advanceAmount']) ? floatval($input['advanceAmount']) : 0;
$remainingAmount = isset($input['remainingAmount']) ? floatval($input['remainingAmount']) : 0;
$appointmentDate = isset($input['appointmentDate']) ? trim($input['appointmentDate']) : null;
$appointmentTime = isset($input['appointmentTime']) ? trim($input['appointmentTime']) : null;
$center = isset($input['center']) ? trim(strip_tags($input['center'])) : '';
$address = isset($input['address']) ? trim(strip_tags($input['address'])) : '';
$latitude = isset($input['latitude']) ? floatval($input['latitude']) : null;
$longitude = isset($input['longitude']) ? floatval($input['longitude']) : null;
$requestNumber = isset($input['request_number']) ? trim(strip_tags($input['request_number'])) : ('REQ-' . date('Ymd-His') . '-' . rand(100, 999));

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

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

// التحقق من سنة الصنع
$currentYear = date('Y');
if ($carYear < 1990 || $carYear > $currentYear) {
    http_response_code(400);
    echo json_encode([
        'success' => false,
        'message' => 'سنة الصنع غير صحيحة. يجب أن تكون بين 1990 و ' . $currentYear
    ]);
    exit();
}

// ============================================
// الاتصال بقاعدة البيانات
// ============================================
require_once __DIR__ . '/../../config/database.php';

$database = new Database();
$db = $database->getConnection();

if (!$db) {
    http_response_code(500);
    echo json_encode([
        'success' => false,
        'message' => 'فشل الاتصال بقاعدة البيانات. يرجى المحاولة مرة أخرى.'
    ]);
    exit();
}

try {
    // بدء المعاملة
    $db->beginTransaction();
    
    // إدراج الطلب في جدول inspection_requests
    $sql = "INSERT INTO inspection_requests (
        request_number, full_name, phone, email, city, 
        car_brand, car_model, car_year, car_color, plate_number,
        service_type, service_name, service_price, 
        advance_amount, remaining_amount,
        appointment_date, appointment_time,
        center_name, address, latitude, longitude,
        status, created_at
    ) VALUES (
        :request_number, :full_name, :phone, :email, :city,
        :car_brand, :car_model, :car_year, :car_color, :plate_number,
        :service_type, :service_name, :service_price,
        :advance_amount, :remaining_amount,
        :appointment_date, :appointment_time,
        :center_name, :address, :latitude, :longitude,
        'pending', NOW()
    )";
    
    $stmt = $db->prepare($sql);
    $result = $stmt->execute([
        ':request_number' => $requestNumber,
        ':full_name' => $fullName,
        ':phone' => $phone,
        ':email' => $email,
        ':city' => $city,
        ':car_brand' => $carBrand,
        ':car_model' => $carModel,
        ':car_year' => $carYear,
        ':car_color' => $carColor,
        ':plate_number' => $plateNumber,
        ':service_type' => $serviceType,
        ':service_name' => $serviceName,
        ':service_price' => $servicePrice,
        ':advance_amount' => $advanceAmount,
        ':remaining_amount' => $remainingAmount,
        ':appointment_date' => $appointmentDate,
        ':appointment_time' => $appointmentTime,
        ':center_name' => $center,
        ':address' => $address,
        ':latitude' => $latitude,
        ':longitude' => $longitude
    ]);
    
    if (!$result) {
        throw new Exception('فشل حفظ الطلب في قاعدة البيانات');
    }
    
    $requestId = $db->lastInsertId();
    
    // إضافة إشعار للمشرف
    $notifSql = "INSERT INTO admin_notifications (title, message, request_number, request_id, created_at) 
                 VALUES (:title, :message, :request_number, :request_id, NOW())";
    $notifStmt = $db->prepare($notifSql);
    $notifStmt->execute([
        ':title' => 'طلب فحص جديد',
        ':message' => 'طلب فحص جديد من ' . $fullName . ' - نوع الفحص: ' . $serviceName,
        ':request_number' => $requestNumber,
        ':request_id' => $requestId
    ]);
    
    // تأكيد المعاملة
    $db->commit();
    
    // تسجيل في سجل الطلبات
    $logFile = __DIR__ . '/../../../logs/requests.log';
    $logDir = dirname($logFile);
    if (!is_dir($logDir)) {
        mkdir($logDir, 0777, true);
    }
    $logEntry = date('Y-m-d H:i:s') . " | NEW REQUEST | $requestNumber | $fullName | $phone | $serviceName | $servicePrice\n";
    file_put_contents($logFile, $logEntry, FILE_APPEND);
    
    // إرجاع الرد
    echo json_encode([
        'success' => true,
        'message' => 'تم استلام طلب الفحص بنجاح',
        'request_number' => $requestNumber,
        'request_id' => $requestId,
        'data' => [
            'fullName' => $fullName,
            'phone' => $phone,
            'serviceName' => $serviceName,
            'servicePrice' => $servicePrice,
            'created_at' => date('Y-m-d H:i:s')
        ]
    ], JSON_UNESCAPED_UNICODE);
    
} catch (Exception $e) {
    // التراجع عن المعاملة في حالة الخطأ
    if (isset($db)) {
        $db->rollBack();
    }
    
    error_log("Database Error: " . $e->getMessage());
    
    http_response_code(500);
    echo json_encode([
        'success' => false,
        'message' => 'حدث خطأ في حفظ الطلب. يرجى المحاولة مرة أخرى.',
        'error' => $e->getMessage()
    ], JSON_UNESCAPED_UNICODE);
}