<?php
// ─── Auth ────────────────────────────────────────────────────────────

function isLoggedIn(): bool {
    return !empty($_SESSION['user_id']);
}

function isAdmin(): bool {
    return !empty($_SESSION['is_admin']);
}

function requireLogin(): void {
    if (!isLoggedIn()) redirect('login.php');
}

function requireAdmin(): void {
    if (!isLoggedIn() || !isAdmin()) {
        redirect('dashboard.php');
    }
}

// ─── Utilitaires ─────────────────────────────────────────────────────

function redirect(string $url): void {
    header("Location: $url");
    exit;
}

function sanitize(string $data): string {
    return htmlspecialchars(trim($data), ENT_QUOTES, 'UTF-8');
}

/**
 * Vérifie un mot de passe : supporte bcrypt ET SHA-256 (legacy).
 * Si SHA-256 correct → migre automatiquement vers bcrypt.
 */
function verifyPassword(PDO $pdo, array $user, string $password): bool {
    $stored = $user['password'];

    // bcrypt
    if (str_starts_with($stored, '$2y$') || str_starts_with($stored, '$2b$')) {
        return password_verify($password, $stored);
    }

    // SHA-256 legacy (64 hex chars)
    if (strlen($stored) === 64 && ctype_xdigit($stored)) {
        if (hash('sha256', $password) === $stored) {
            // Migration automatique vers bcrypt
            $newHash = password_hash($password, PASSWORD_BCRYPT, ['cost' => 12]);
            $pdo->prepare("UPDATE users SET password=? WHERE id=?")->execute([$newHash, $user['id']]);
            return true;
        }
        return false;
    }

    // Fallback bcrypt
    return password_verify($password, $stored);
}

// ─── Chauffeurs ──────────────────────────────────────────────────────

/**
 * Retourne les chauffeurs actifs disponibles pour une date+heure données.
 * Utilise date('N') : 1=Lundi … 7=Dimanche (ISO-8601).
 */
function getAvailableChauffeurs(PDO $pdo, string $date, string $time): array {
    try {
        // Vérifier que la date est valide
        if (!strtotime($date)) {
            return [];
        }
        
        $dayOfWeek = (int) date('N', strtotime($date));
        
        $sql = "SELECT c.*
                FROM chauffeurs c
                INNER JOIN chauffeur_availability ca ON c.id = ca.chauffeur_id
                WHERE c.active = 1
                  AND ca.day_of_week = ?
                  AND ca.start_time <= ?
                  AND ca.end_time >= ?
                GROUP BY c.id
                ORDER BY c.name";
        
        $stmt = $pdo->prepare($sql);
        $stmt->execute([$dayOfWeek, $time, $time]);
        return $stmt->fetchAll(PDO::FETCH_ASSOC);
        
    } catch (PDOException $e) {
        // Log l'erreur et retourne un tableau vide
        error_log("Erreur getAvailableChauffeurs: " . $e->getMessage());
        return [];
    }
}

/**
 * Vérifie qu'un créneau n'est pas déjà pris (hors réservation exclue).
 */
function isTimeSlotAvailable(PDO $pdo, int $chauffeurId, string $date, string $time, ?int $excludeId = null): bool {
    try {
        $sql = "SELECT id FROM reservations
                WHERE chauffeur_id = ?
                  AND reservation_date = ?
                  AND reservation_time = ?
                  AND status = 'confirmée'";
        $params = [$chauffeurId, $date, $time];

        if ($excludeId) {
            $sql .= " AND id != ?";
            $params[] = $excludeId;
        }

        $stmt = $pdo->prepare($sql);
        $stmt->execute($params);
        return $stmt->rowCount() === 0;
        
    } catch (PDOException $e) {
        error_log("Erreur isTimeSlotAvailable: " . $e->getMessage());
        return false;
    }
}

// ─── Email ───────────────────────────────────────────────────────────

/**
 * Envoie un email HTML via mail().
 * Version désactivée pour éviter les erreurs en développement.
 */
function sendMail(string $to, string $subject, string $htmlBody): bool {
    // Désactiver l'envoi d'email en développement
    // Afficher un log au lieu d'envoyer réellement
    error_log("EMAIL SIMULATION - To: $to, Subject: $subject");
    error_log("Body: " . substr($htmlBody, 0, 200) . "...");
    
    // Simuler un envoi réussi
    return true;
    
    /* Version active (à utiliser en production avec un serveur SMTP configuré)
    $headers  = "MIME-Version: 1.0\r\n";
    $headers .= "Content-Type: text/html; charset=UTF-8\r\n";
    $headers .= "From: First Car <noreply@firstcar.fr>\r\n";
    $headers .= "X-Mailer: PHP/" . phpversion();
    return mail($to, $subject, $htmlBody, $headers);
    */
}

function sendBookingConfirmation(string $to, string $userName, array $res): void {
    $subject = "✅ Réservation confirmée – First Car";
    $body = "
    <div style='font-family:Montserrat,sans-serif;max-width:600px;margin:0 auto;background:#1a1a1a;color:#f0ede8;padding:32px;border-radius:12px;'>
      <h2 style='color:#e8820c;font-family:Georgia,serif;'>First Car<span style='color:#f0ede8;'>.</span></h2>
      <h3>Bonjour {$userName},</h3>
      <p>Votre réservation a bien été confirmée :</p>
      <table style='width:100%;border-collapse:collapse;margin:20px 0;'>
        <tr><td style='padding:10px;border-bottom:1px solid #333;color:#aaa;'>Véhicule</td>
            <td style='padding:10px;border-bottom:1px solid #333;font-weight:600;'>{$res['car_name']}</td></tr>
        <tr><td style='padding:10px;border-bottom:1px solid #333;color:#aaa;'>Chauffeur</td>
            <td style='padding:10px;border-bottom:1px solid #333;font-weight:600;'>{$res['chauffeur_name']}</td></tr>
        <tr><td style='padding:10px;border-bottom:1px solid #333;color:#aaa;'>Date</td>
            <td style='padding:10px;border-bottom:1px solid #333;font-weight:600;'>{$res['reservation_date']}</td></tr>
        <tr><td style='padding:10px;border-bottom:1px solid #333;color:#aaa;'>Heure</td>
            <td style='padding:10px;border-bottom:1px solid #333;font-weight:600;'>{$res['reservation_time']}</td></tr>
        <tr><td style='padding:10px;color:#aaa;'>Départ</td>
            <td style='padding:10px;font-weight:600;'>{$res['pickup_address']}</td></tr>
      </table>
      <p style='color:#aaa;font-size:14px;'>Questions : <a href='mailto:firstcar92@hotmail.com' style='color:#e8820c;'>firstcar92@hotmail.com</a></p>
      <p style='color:#666;font-size:12px;margin-top:24px;'>© " . date('Y') . " First Car</p>
    </div>";
    sendMail($to, $subject, $body);
}

function sendPasswordResetEmail(string $to, string $userName, string $resetLink): void {
    $subject = "🔑 Réinitialisation de votre mot de passe – First Car";
    $body = "
    <div style='font-family:Montserrat,sans-serif;max-width:600px;margin:0 auto;background:#1a1a1a;color:#f0ede8;padding:32px;border-radius:12px;'>
      <h2 style='color:#e8820c;font-family:Georgia,serif;'>First Car<span style='color:#f0ede8;'>.</span></h2>
      <h3>Bonjour {$userName},</h3>
      <p>Cliquez sur le bouton ci-dessous pour réinitialiser votre mot de passe (valable <strong>1 heure</strong>) :</p>
      <div style='text-align:center;margin:32px 0;'>
        <a href='{$resetLink}' style='background:#e8820c;color:#1a1a1a;padding:14px 32px;border-radius:30px;text-decoration:none;font-weight:700;font-size:16px;'>Réinitialiser mon mot de passe</a>
      </div>
      <p style='color:#aaa;font-size:13px;'>Si vous n'avez pas fait cette demande, ignorez cet email.</p>
      <p style='color:#666;font-size:12px;margin-top:24px;'>© " . date('Y') . " First Car</p>
    </div>";
    sendMail($to, $subject, $body);
}
?>