<?php
// ============================================================
// includes/auth.php — المصادقة وإدارة الجلسات
// ============================================================

require_once __DIR__ . '/../config/database.php';
require_once __DIR__ . '/../config/constants.php';

function startSecureSession(): void {
    if (session_status() === PHP_SESSION_NONE) {
        session_name(SESSION_NAME);
        session_set_cookie_params([
            'lifetime' => SESSION_LIFETIME,
            'path'     => '/',
            'secure'   => isset($_SERVER['HTTPS']),
            'httponly' => true,
            'samesite' => 'Lax',
        ]);
        session_start();
        if (empty($_SESSION['_initiated'])) {
            session_regenerate_id(true);
            $_SESSION['_initiated'] = true;
        }
    }
}

function login(string $email, string $password): array {
    $pdo  = db();
    $stmt = $pdo->prepare('SELECT id, full_name, email, password_hash, role, status FROM users WHERE email = ? LIMIT 1');
    $stmt->execute([trim($email)]);
    $user = $stmt->fetch();

    if (!$user || !password_verify($password, $user['password_hash'])) {
        return ['success' => false, 'message' => 'البريد الإلكتروني أو كلمة المرور غير صحيحة'];
    }
    if ($user['status'] === 'inactive') {
        return ['success' => false, 'message' => 'الحساب معطّل. تواصل مع المدير'];
    }
    if ($user['status'] === 'rejected' && $user['role'] !== 'lawyer') {
        return ['success' => false, 'message' => 'تم رفض حسابك. تواصل مع المدير'];
    }

    // المحامي يمكنه الدخول حتى لو كان حسابه معلقاً أو مرفوضاً (لرفع الوثائق)
    $_SESSION['user_id']     = $user['id'];
    $_SESSION['user_name']   = $user['full_name'];
    $_SESSION['user_role']   = $user['role'];
    $_SESSION['user_email']  = $user['email'];
    $_SESSION['user_status'] = $user['status'];
    $_SESSION['logged_in']   = true;
    $_SESSION['login_time']  = time();

    $pdo->prepare('UPDATE users SET last_login = NOW() WHERE id = ?')->execute([$user['id']]);
    auditLog($user['id'], 'login', 'users', $user['id'], 'تسجيل دخول');

    return ['success' => true, 'role' => $user['role']];
}

function logout(): void {
    startSecureSession();
    auditLog($_SESSION['user_id'] ?? null, 'logout', 'users', $_SESSION['user_id'] ?? null, 'تسجيل خروج');
    $_SESSION = [];
    session_destroy();
    header('Location: ' . BASE_URL . '/public/index.php');
    exit;
}

function isLoggedIn(): bool {
    startSecureSession();
    if (empty($_SESSION['logged_in'])) return false;
    if ((time() - ($_SESSION['login_time'] ?? 0)) > SESSION_LIFETIME) {
        logout();
    }
    return true;
}

function currentUser(): array {
    return [
        'id'     => $_SESSION['user_id']     ?? 0,
        'name'   => $_SESSION['user_name']   ?? '',
        'role'   => $_SESSION['user_role']   ?? '',
        'email'  => $_SESSION['user_email']  ?? '',
        'status' => $_SESSION['user_status'] ?? 'active',
    ];
}

function requireLogin(): void {
    if (!isLoggedIn()) {
        header('Location: ' . BASE_URL . '/public/index.php?redirect=' . urlencode($_SERVER['REQUEST_URI']));
        exit;
    }
    // تحديث حالة المستخدم من قاعدة البيانات في كل طلب (لأن الأدمين قد يغيّر الحالة)
    $uid = $_SESSION['user_id'] ?? 0;
    if ($uid) {
        $row = db()->prepare('SELECT status FROM users WHERE id=? LIMIT 1');
        $row->execute([$uid]);
        $fresh = $row->fetch();
        if ($fresh) {
            $_SESSION['user_status'] = $fresh['status'];
            // إذا عطّل الأدمين حساباً نشطاً — أخرجه فوراً
            if ($fresh['status'] === 'inactive') {
                logout();
            }
        }
    }
}

function registerLawyer(array $data): array {
    $pdo = db();
    $chk = $pdo->prepare('SELECT id FROM users WHERE email = ? LIMIT 1');
    $chk->execute([$data['email']]);
    if ($chk->fetch()) {
        return ['success' => false, 'message' => 'البريد الإلكتروني مستخدم مسبقاً'];
    }
    $hash = password_hash($data['password'], PASSWORD_BCRYPT, ['cost' => 12]);
    $pdo->beginTransaction();
    try {
        $pdo->prepare('INSERT INTO users (full_name, email, password_hash, phone, role, status) VALUES (?,?,?,?,?,?)')
            ->execute([$data['full_name'], $data['email'], $hash, $data['phone'], 'lawyer', 'pending']);
        $userId = $pdo->lastInsertId();
        $pdo->prepare('INSERT INTO lawyer_profiles (user_id, bar_number, bar_association, bar_association_id, specialization) VALUES (?,?,?,?,?)')
            ->execute([$userId, $data['bar_number'], $data['bar_association'], $data['bar_association_id'] ?? null, $data['specialization']]);
        $pdo->commit();
        return ['success' => true, 'user_id' => $userId];
    } catch (\Exception $e) {
        $pdo->rollBack();
        error_log($e->getMessage());
        return ['success' => false, 'message' => 'حدث خطأ أثناء التسجيل'];
    }
}

function auditLog(?int $userId, string $action, string $entityType, ?int $entityId, string $desc = ''): void {
    try {
        $ip = $_SERVER['REMOTE_ADDR'] ?? null;
        db()->prepare('INSERT INTO audit_log (user_id, action, entity_type, entity_id, description, ip_address) VALUES (?,?,?,?,?,?)')
            ->execute([$userId, $action, $entityType, $entityId, $desc, $ip]);
    } catch (\Exception $e) {
        error_log('AuditLog error: ' . $e->getMessage());
    }
}

function createClerkAccount(array $data): array
{
    $pdo = db();
 
    /* ── 1. التحقق من عدم تكرار البريد الإلكتروني ── */
    $stmt = $pdo->prepare("SELECT id FROM users WHERE email = ? LIMIT 1");
    $stmt->execute([$data['email']]);
    if ($stmt->fetch()) {
        return ['success' => false, 'message' => 'البريد الإلكتروني مستخدم بالفعل', 'user_id' => null];
    }
 
    /* ── 2. تشفير كلمة المرور ── */
    $hashed = password_hash($data['password'], PASSWORD_BCRYPT, ['cost' => 12]);
 
    /* ── 3. إدراج السجل في جدول users ── */
    try {
        $stmt = $pdo->prepare("
            INSERT INTO users
                (full_name, email, phone, role, password_hash, status)
            VALUES
                (:full_name, :email, :phone, 'clerk', :password_hash, :status)
        ");
        $stmt->execute([
            ':full_name'     => $data['full_name'],
            ':email'         => $data['email'],
            ':phone'         => $data['phone'],
            ':password_hash' => $hashed,
            ':status'        => $data['status'] ?? 'active',
        ]);
        $userId = (int)$pdo->lastInsertId();
    } catch (PDOException $e) {
        // سجّل الخطأ ولا تُظهره للمستخدم
        error_log('createClerkAccount PDO error: ' . $e->getMessage());
        return ['success' => false, 'message' => 'خطأ في قاعدة البيانات، يرجى المحاولة لاحقاً', 'user_id' => null];
    }
 
    /* ── 4. تسجيل الحدث في سجل التدقيق (audit log) ── */
    try {
        auditLog($_SESSION['user_id'] ?? null, 'create_clerk', 'users', $userId, 'إنشاء حساب أمين ضبط: ' . $data['email']);
    } catch (PDOException $e) {
        error_log('Audit log error: ' . $e->getMessage());
        // لا نوقف العملية إذا فشل السجل
    }
 
    /* ── 5. إرسال بريد إلكتروني ببيانات الدخول (اختياري) ── */
    // sendClerkWelcomeEmail($data['email'], $data['full_name'], $data['password']);
 
    return [
        'success' => true,
        'message' => 'تم إنشاء الحساب بنجاح',
        'user_id' => $userId,
    ];
}