<?php
// إعدادات API
header('Content-Type: application/json');
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS');
header('Access-Control-Allow-Headers: Content-Type, Authorization, X-Requested-With');
header('Access-Control-Allow-Credentials: true');

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

// إعدادات قاعدة البيانات
class Database {
    private $host = "localhost";
    private $db_name = "digitals_autotester_db";
    private $username = "digitals";
    private $password = "bassam.bassam";
    private $conn;
    private static $instance = null;

    private function __construct() {}

    public static function getInstance() {
        if (self::$instance === null) {
            self::$instance = new Database();
        }
        return self::$instance;
    }

    public function getConnection() {
        if ($this->conn === null) {
            try {
                $this->conn = new PDO(
                    "mysql:host=" . $this->host . ";dbname=" . $this->db_name . ";charset=utf8mb4",
                    $this->username,
                    $this->password
                );
                $this->conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
                $this->conn->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
            } catch(PDOException $e) {
                $this->sendResponse(false, 'Database connection failed: ' . $e->getMessage());
            }
        }
        return $this->conn;
    }

    private function sendResponse($success, $message, $data = null, $statusCode = 200) {
        http_response_code($statusCode);
        echo json_encode([
            'success' => $success,
            'message' => $message,
            'data' => $data,
            'timestamp' => date('Y-m-d H:i:s')
        ]);
        exit();
    }
}

// دوال مساعدة
function sendResponse($success, $message, $data = null, $statusCode = 200) {
    http_response_code($statusCode);
    echo json_encode([
        'success' => $success,
        'message' => $message,
        'data' => $data,
        'timestamp' => date('Y-m-d H:i:s')
    ]);
    exit();
}

function getRequestData() {
    $method = $_SERVER['REQUEST_METHOD'];

    if ($method === 'GET') {
        return $_GET;
    }

    $input = json_decode(file_get_contents('php://input'), true);
    if ($input === null) {
        return $_POST;
    }
    return $input;
}

function validateRequiredFields($data, $required) {
    $missing = [];
    foreach ($required as $field) {
        if (empty($data[$field])) {
            $missing[] = $field;
        }
    }
    if (!empty($missing)) {
        sendResponse(false, 'الحقول التالية مطلوبة: ' . implode(', ', $missing), null, 400);
    }
}

// تسجيل الأخطاء
error_reporting(E_ALL);
ini_set('display_errors', 1);
ini_set('log_errors', 1);
ini_set('error_log', __DIR__ . '/error.log');

// معالج الطلبات الرئيسي
$action = isset($_GET['action']) ? $_GET['action'] : (isset($_POST['action']) ? $_POST['action'] : null);
$method = $_SERVER['REQUEST_METHOD'];

if (!$action) {
    $path = $_SERVER['PATH_INFO'] ?? '';
    $pathParts = explode('/', trim($path, '/'));
    $action = $pathParts[0] ?? '';
}

try {
    $db = Database::getInstance();
    $pdo = $db->getConnection();
    $data = getRequestData();

    switch ($action) {

        // تسجيل دخول
        case 'login':
            if ($method !== 'POST') sendResponse(false, 'Method not allowed', null, 405);
            validateRequiredFields($data, ['email', 'password']);

            // التحقق من وجود الجدول
            $stmt = $pdo->query("SHOW TABLES LIKE 'users'");
            $tableExists = $stmt->rowCount() > 0;

            if (!$tableExists) {
                sendResponse(false, 'جدول المستخدمين غير موجود', null, 500);
            }

            // التحقق من وجود الأعمدة المطلوبة
            $stmt = $pdo->query("SHOW COLUMNS FROM `users`");
            $columns = $stmt->fetchAll(PDO::FETCH_COLUMN);

            $requiredColumns = ['id', 'email', 'phone', 'password_hash', 'role', 'status', 'is_active'];
            $missingColumns = array_diff($requiredColumns, $columns);

            if (!empty($missingColumns)) {
                sendResponse(false, 'هناك أعمدة ناقصة في جدول المستخدمين: ' . implode(', ', $missingColumns), null, 500);
            }

            // البحث عن المستخدم
            $stmt = $pdo->prepare("
                SELECT id, username, email, phone, role, status, is_active, full_name, last_login
                FROM users
                WHERE (email = :identifier OR phone = :identifier)
                AND status = 'active'
                AND is_active = 1
            ");
            $stmt->execute(['identifier' => $data['email']]);
            $user = $stmt->fetch();

            if (!$user) {
                sendResponse(false, 'البريد الإلكتروني أو رقم الهاتف غير صحيح');
            }

            // التحقق من كلمة المرور
            $stmt = $pdo->prepare("SELECT password_hash FROM users WHERE id = :id");
            $stmt->execute(['id' => $user['id']]);
            $passwordData = $stmt->fetch();

            if (!$passwordData || !password_verify($data['password'], $passwordData['password_hash'])) {
                sendResponse(false, 'كلمة المرور غير صحيحة');
            }

            // تحديث آخر تسجيل دخول
            $stmt = $pdo->prepare("UPDATE users SET last_login = NOW() WHERE id = :id");
            $stmt->execute(['id' => $user['id']]);

            sendResponse(true, 'تم تسجيل الدخول بنجاح', $user);
            break;

        // الحالة الافتراضية
        default:
            sendResponse(false, 'Invalid action', null, 400);
    }

} catch (PDOException $e) {
    sendResponse(false, 'Database error: ' . $e->getMessage(), null, 500);
} catch (Exception $e) {
    sendResponse(false, 'Server error: ' . $e->getMessage(), null, 500);
}
?>