<?php
/**
 * ajax_auth_handler.php - معالج موحد للمصادقة
 */

require_once 'config.php';
require_once 'includes/email_service.php';

header('Content-Type: application/json');

if (session_status() === PHP_SESSION_NONE) {
    session_start();
}

$action = $_POST['action'] ?? $_GET['action'] ?? '';

switch ($action) {
    case 'login':
        handleLogin($conn);
        break;
        
    case 'register':
        handleRegister($conn);
        break;
        
    case 'verify_otp':
        handleVerifyOTP($conn);
        break;
        
    case 'resend_otp':
        handleResendOTP($conn);
        break;
        
    case 'forgot_password':
        handleForgotPassword($conn);
        break;
        
    case 'reset_password':
        handleResetPassword($conn);
        break;
        
    case 'update_location':
        handleUpdateLocation($conn);
        break;
        
    case 'check_auth':
        handleCheckAuth();
        break;
        
    case 'logout':
        handleLogout($conn);
        break;
        
    default:
        echo json_encode(['success' => false, 'message' => 'إجراء غير معروف']);
        break;
}

/**
 * تسجيل الدخول
 */
function handleLogin($conn) {
    $email = trim($_POST['email'] ?? '');
    $password = $_POST['password'] ?? '';
    $remember = isset($_POST['remember']) ? (bool)$_POST['remember'] : true;
    
    if (empty($email) || empty($password)) {
        echo json_encode(['success' => false, 'message' => 'جميع الحقول مطلوبة']);
        return;
    }
    
    // التحقق من وجود المستخدم
    $stmt = $conn->prepare("
        SELECT id, name, phone, password, address, email_verified, latitude, longitude 
        FROM customers WHERE email = ?
    ");
    $stmt->bind_param("s", $email);
    $stmt->execute();
    $result = $stmt->get_result();
    
    if ($result->num_rows === 0) {
        // لأسباب أمنية، لا نحدد إذا كان البريد موجوداً أم لا
        echo json_encode(['success' => false, 'message' => 'البريد الإلكتروني أو كلمة المرور غير صحيحة']);
        return;
    }
    
    $user = $result->fetch_assoc();
    
    // التحقق من كلمة المرور
    if (!password_verify($password, $user['password'])) {
        echo json_encode(['success' => false, 'message' => 'البريد الإلكتروني أو كلمة المرور غير صحيحة']);
        return;
    }
    
    // التحقق من تفعيل البريد
    if ($user['email_verified'] == 0) {
        echo json_encode([
            'success' => false, 
            'message' => 'الحساب غير مفعل. يرجى تفعيله عبر البريد الإلكتروني',
            'needs_verification' => true,
            'email' => $email
        ]);
        return;
    }
    
    // بدء الجلسة
    $_SESSION['customer_id'] = $user['id'];
    $_SESSION['customer_name'] = $user['name'];
    $_SESSION['customer_phone'] = $user['phone'];
    $_SESSION['customer_email'] = $email;
    $_SESSION['customer_address'] = $user['address'];
    $_SESSION['customer_lat'] = $user['latitude'];
    $_SESSION['customer_lng'] = $user['longitude'];
    $_SESSION['last_activity'] = time();
    $_SESSION['valid_session'] = true;
    
    // تجديد معرف الجلسة
    session_regenerate_id(true);
    
    // تعيين Remember Me cookie (7 أيام)
    if ($remember) {
        $token = bin2hex(random_bytes(32));
        $expires = date('Y-m-d H:i:s', strtotime('+7 days'));
        
        $update = $conn->prepare("UPDATE customers SET remember_token = ?, token_expires = ? WHERE id = ?");
        $update->bind_param("ssi", $token, $expires, $user['id']);
        $update->execute();
        
        setcookie('remember_token', $token, time() + (86400 * 7), '/', '', false, true);
    }
    
    echo json_encode([
        'success' => true,
        'message' => 'تم تسجيل الدخول بنجاح',
        'user' => [
            'id' => $user['id'],
            'name' => $user['name'],
            'email' => $email
        ]
    ]);
}

/**
 * إنشاء حساب جديد
 */
function handleRegister($conn) {
    $name = trim($_POST['name'] ?? '');
    $phone = trim($_POST['phone'] ?? '');
    $email = trim($_POST['email'] ?? '');
    $address = trim($_POST['address'] ?? '');
    $password = $_POST['password'] ?? '';
    $confirm = $_POST['confirm_password'] ?? '';
    $latitude = isset($_POST['latitude']) ? (float)$_POST['latitude'] : null;
    $longitude = isset($_POST['longitude']) ? (float)$_POST['longitude'] : null;
    
    // التحقق من الحقول المطلوبة
    if (empty($name) || empty($phone) || empty($email) || empty($address) || empty($password)) {
        echo json_encode(['success' => false, 'message' => 'جميع الحقول مطلوبة']);
        return;
    }
    
    // التحقق من رقم الهاتف
    if (!preg_match('/^[0-9]{9}$/', $phone)) {
        echo json_encode(['success' => false, 'message' => 'رقم الهاتف يجب أن يكون 9 أرقام']);
        return;
    }
    
    // التحقق من البريد الإلكتروني
    if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
        echo json_encode(['success' => false, 'message' => 'البريد الإلكتروني غير صالح']);
        return;
    }
    
    // التحقق من تطابق كلمات المرور
    if ($password !== $confirm) {
        echo json_encode(['success' => false, 'message' => 'كلمات المرور غير متطابقة']);
        return;
    }
    
    // التحقق من طول كلمة المرور
    if (strlen($password) < 6) {
        echo json_encode(['success' => false, 'message' => 'كلمة المرور يجب أن تكون 6 أحرف على الأقل']);
        return;
    }
    
    // التحقق من عدم تكرار البريد أو الهاتف
    $check = $conn->prepare("SELECT id FROM customers WHERE email = ? OR phone = ?");
    $check->bind_param("ss", $email, $phone);
    $check->execute();
    $result = $check->get_result();
    
    if ($result->num_rows > 0) {
        echo json_encode(['success' => false, 'message' => 'البريد الإلكتروني أو رقم الهاتف مسجل مسبقاً']);
        return;
    }
    
    // تشفير كلمة المرور
    $hashed = password_hash($password, PASSWORD_DEFAULT);
    
    // إدراج المستخدم (غير مفعل)
    $stmt = $conn->prepare("
        INSERT INTO customers (name, phone, email, password, address, latitude, longitude, email_verified) 
        VALUES (?, ?, ?, ?, ?, ?, ?, 0)
    ");
    $stmt->bind_param("sssssdd", $name, $phone, $email, $hashed, $address, $latitude, $longitude);
    
    if (!$stmt->execute()) {
        echo json_encode(['success' => false, 'message' => 'حدث خطأ في إنشاء الحساب']);
        return;
    }
    
    // إنشاء وإرسال رمز التحقق
    $otp = generateOTP();
    
    if (!storeOTP($conn, $email, $otp, 'registration')) {
        echo json_encode(['success' => false, 'message' => 'حدث خطأ في تخزين رمز التحقق']);
        return;
    }
    
    $emailService = new EmailService();
    if (!$emailService->sendOTP($email, $name, $otp, 'registration')) {
        echo json_encode(['success' => false, 'message' => 'حدث خطأ في إرسال رمز التحقق']);
        return;
    }
    
    echo json_encode([
        'success' => true,
        'message' => 'تم إنشاء الحساب. يرجى التحقق من بريدك الإلكتروني',
        'email' => $email,
        'needs_verification' => true
    ]);
}

/**
 * التحقق من رمز OTP
 */
function handleVerifyOTP($conn) {
    $email = trim($_POST['email'] ?? '');
    $otp = trim($_POST['otp'] ?? '');
    $purpose = $_POST['purpose'] ?? 'registration';
    
    if (empty($email) || empty($otp)) {
        echo json_encode(['success' => false, 'message' => 'جميع الحقول مطلوبة']);
        return;
    }
    
    if (verifyOTP($conn, $email, $otp, $purpose)) {
        if ($purpose === 'registration') {
            // تفعيل الحساب
            $update = $conn->prepare("UPDATE customers SET email_verified = 1 WHERE email = ?");
            $update->bind_param("s", $email);
            $update->execute();
            
            // جلب بيانات المستخدم لتسجيل الدخول تلقائياً
            $user = $conn->prepare("SELECT id, name, phone, address FROM customers WHERE email = ?");
            $user->bind_param("s", $email);
            $user->execute();
            $result = $user->get_result()->fetch_assoc();
            
            // بدء الجلسة
            $_SESSION['customer_id'] = $result['id'];
            $_SESSION['customer_name'] = $result['name'];
            $_SESSION['customer_phone'] = $result['phone'];
            $_SESSION['customer_email'] = $email;
            $_SESSION['customer_address'] = $result['address'];
            $_SESSION['last_activity'] = time();
            $_SESSION['valid_session'] = true;
            
            // إرسال بريد ترحيبي
            $emailService = new EmailService();
            $emailService->sendWelcomeEmail($email, $result['name']);
            
            echo json_encode([
                'success' => true,
                'message' => 'تم تفعيل الحساب بنجاح',
                'auto_login' => true
            ]);
        } else {
            // لإعادة تعيين كلمة المرور
            echo json_encode([
                'success' => true,
                'message' => 'تم التحقق بنجاح',
                'can_reset' => true,
                'email' => $email
            ]);
        }
    } else {
        echo json_encode(['success' => false, 'message' => 'رمز التحقق غير صالح أو منتهي الصلاحية']);
    }
}

/**
 * إعادة إرسال رمز التحقق
 */
function handleResendOTP($conn) {
    $email = trim($_POST['email'] ?? '');
    $purpose = $_POST['purpose'] ?? 'registration';
    
    if (empty($email)) {
        echo json_encode(['success' => false, 'message' => 'البريد الإلكتروني مطلوب']);
        return;
    }
    
    // جلب اسم المستخدم
    $user = $conn->prepare("SELECT name FROM customers WHERE email = ?");
    $user->bind_param("s", $email);
    $user->execute();
    $result = $user->get_result();
    
    if ($result->num_rows === 0) {
        // لأسباب أمنية، لا نكشف أن البريد غير موجود
        echo json_encode(['success' => true, 'message' => 'تم إرسال رمز التحقق الجديد']);
        return;
    }
    
    $name = $result->fetch_assoc()['name'];
    
    // إنشاء رمز جديد
    $otp = generateOTP();
    
    // تخزين الرمز الجديد
    if (!storeOTP($conn, $email, $otp, $purpose)) {
        echo json_encode(['success' => false, 'message' => 'حدث خطأ في تخزين رمز التحقق']);
        return;
    }
    
    // إرسال البريد
    $emailService = new EmailService();
    if (!$emailService->sendOTP($email, $name, $otp, $purpose)) {
        echo json_encode(['success' => false, 'message' => 'حدث خطأ في إرسال رمز التحقق']);
        return;
    }
    
    echo json_encode(['success' => true, 'message' => 'تم إرسال رمز التحقق الجديد']);
}

/**
 * طلب إعادة تعيين كلمة المرور
 */
function handleForgotPassword($conn) {
    $email = trim($_POST['email'] ?? '');
    
    if (empty($email)) {
        echo json_encode(['success' => false, 'message' => 'البريد الإلكتروني مطلوب']);
        return;
    }
    
    // التحقق من وجود المستخدم
    $user = $conn->prepare("SELECT id, name FROM customers WHERE email = ?");
    $user->bind_param("s", $email);
    $user->execute();
    $result = $user->get_result();
    
    if ($result->num_rows === 0) {
        // لأسباب أمنية، لا نكشف أن البريد غير موجود
        echo json_encode(['success' => true, 'message' => 'إذا كان البريد الإلكتروني مسجلاً، سيتم إرسال رمز التحقق']);
        return;
    }
    
    $name = $result->fetch_assoc()['name'];
    
    // إنشاء وإرسال رمز التحقق
    $otp = generateOTP();
    
    if (!storeOTP($conn, $email, $otp, 'reset_password')) {
        echo json_encode(['success' => false, 'message' => 'حدث خطأ في تخزين رمز التحقق']);
        return;
    }
    
    $emailService = new EmailService();
    if (!$emailService->sendOTP($email, $name, $otp, 'reset_password')) {
        echo json_encode(['success' => false, 'message' => 'حدث خطأ في إرسال رمز التحقق']);
        return;
    }
    
    echo json_encode([
        'success' => true, 
        'message' => 'تم إرسال رمز التحقق إلى بريدك الإلكتروني',
        'email' => $email
    ]);
}

/**
 * إعادة تعيين كلمة المرور
 */
function handleResetPassword($conn) {
    $email = trim($_POST['email'] ?? '');
    $password = $_POST['password'] ?? '';
    $confirm = $_POST['confirm_password'] ?? '';
    
    if (empty($email) || empty($password)) {
        echo json_encode(['success' => false, 'message' => 'جميع الحقول مطلوبة']);
        return;
    }
    
    if ($password !== $confirm) {
        echo json_encode(['success' => false, 'message' => 'كلمات المرور غير متطابقة']);
        return;
    }
    
    if (strlen($password) < 6) {
        echo json_encode(['success' => false, 'message' => 'كلمة المرور يجب أن تكون 6 أحرف على الأقل']);
        return;
    }
    
    $hashed = password_hash($password, PASSWORD_DEFAULT);
    
    $update = $conn->prepare("UPDATE customers SET password = ? WHERE email = ?");
    $update->bind_param("ss", $hashed, $email);
    
    if ($update->execute()) {
        echo json_encode(['success' => true, 'message' => 'تم تغيير كلمة المرور بنجاح']);
    } else {
        echo json_encode(['success' => false, 'message' => 'حدث خطأ في تغيير كلمة المرور']);
    }
}

/**
 * تحديث موقع المستخدم
 */
function handleUpdateLocation($conn) {
    if (!isset($_SESSION['customer_id'])) {
        echo json_encode(['success' => false, 'message' => 'login_required']);
        return;
    }
    
    $latitude = $_POST['latitude'] ?? null;
    $longitude = $_POST['longitude'] ?? null;
    $address = trim($_POST['address'] ?? '');
    
    if (!$latitude || !$longitude) {
        echo json_encode(['success' => false, 'message' => 'الموقع غير صالح']);
        return;
    }
    
    $stmt = $conn->prepare("UPDATE customers SET latitude = ?, longitude = ?, address = ? WHERE id = ?");
    $stmt->bind_param("ddsi", $latitude, $longitude, $address, $_SESSION['customer_id']);
    
    if ($stmt->execute()) {
        // تحديث الجلسة
        $_SESSION['customer_lat'] = $latitude;
        $_SESSION['customer_lng'] = $longitude;
        $_SESSION['customer_address'] = $address;
        
        echo json_encode(['success' => true, 'message' => 'تم تحديث الموقع بنجاح']);
    } else {
        echo json_encode(['success' => false, 'message' => 'حدث خطأ في تحديث الموقع']);
    }
}

/**
 * التحقق من حالة تسجيل الدخول
 */
function handleCheckAuth() {
    $isLoggedIn = isset($_SESSION['customer_id']) && isset($_SESSION['valid_session']);
    
    if ($isLoggedIn) {
        echo json_encode([
            'success' => true,
            'logged_in' => true,
            'user' => [
                'id' => $_SESSION['customer_id'],
                'name' => $_SESSION['customer_name'],
                'phone' => $_SESSION['customer_phone'] ?? '',
                'email' => $_SESSION['customer_email'] ?? '',
                'address' => $_SESSION['customer_address'] ?? '',
                'lat' => $_SESSION['customer_lat'] ?? null,
                'lng' => $_SESSION['customer_lng'] ?? null
            ]
        ]);
    } else {
        echo json_encode(['success' => true, 'logged_in' => false]);
    }
}

/**
 * تسجيل الخروج
 */
function handleLogout($conn) {
    // حذف Remember Me token من قاعدة البيانات
    if (isset($_SESSION['customer_id'])) {
        $update = $conn->prepare("UPDATE customers SET remember_token = NULL, token_expires = NULL WHERE id = ?");
        $update->bind_param("i", $_SESSION['customer_id']);
        $update->execute();
    }
    
    // حذف cookie
    setcookie('remember_token', '', time() - 3600, '/');
    
    // تدمير الجلسة
    $_SESSION = array();
    
    if (ini_get("session.use_cookies")) {
        $params = session_get_cookie_params();
        setcookie(session_name(), '', time() - 42000,
            $params["path"], $params["domain"],
            $params["secure"], $params["httponly"]
        );
    }
    
    session_destroy();
    
    echo json_encode(['success' => true, 'message' => 'تم تسجيل الخروج بنجاح']);
}
?>