<?php
/**
 * Gestionnaire d'authentification
 * Fichier : auth.php
 * Gère : Connexion classique + Inscription libre
 */

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

// Vérifier la méthode HTTP
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
    header('Location: login.php');
    exit;
}

// ==========================================
// INSCRIPTION LIBRE (élèves soutien)
// ==========================================
if (isset($_GET['action']) && $_GET['action'] === 'register') {
    
    // Récupération des données du formulaire
    $prenom = trim($_POST['prenom'] ?? '');
    $nom = trim($_POST['nom'] ?? '');
    $password = trim($_POST['password'] ?? '');
    
    $errors = [];
    
    // Validation des champs
    if (empty($prenom)) {
        $errors[] = "Le prénom est obligatoire.";
    }
    if (empty($nom)) {
        $errors[] = "Le nom est obligatoire.";
    }
    if (empty($password)) {
        $errors[] = "Le mot de passe est obligatoire.";
    }
    
    // Validation format mot de passe (JJMM - 4 chiffres)
    if (!empty($password) && !preg_match('/^\d{4}$/', $password)) {
        $errors[] = "Le mot de passe doit être au format JJMM (4 chiffres, ex: 2710).";
    }
    
    // Si erreurs, rediriger avec message
    if (!empty($errors)) {
        $_SESSION['error'] = implode('<br>', $errors);
        header('Location: login.php');
        exit;
    }
    
    try {
        $db = Database::getInstance();
        
        // Génération du login : prenom.nom (minuscules, sans accents)
        $login = generateLogin($prenom, $nom);
        
        // Vérifier si le login existe déjà
        $checkQuery = "SELECT id_utilisateur FROM utilisateurs WHERE login = ?";
        $existing = $db->fetchOne($checkQuery, [$login]);
        
        if ($existing) {
            // Login déjà pris, ajouter un suffixe numérique
            $counter = 1;
            $baseLogin = $login;
            do {
                $login = $baseLogin . $counter;
                $existing = $db->fetchOne($checkQuery, [$login]);
                $counter++;
            } while ($existing && $counter < 100);
            
            if ($existing) {
                throw new Exception("Impossible de générer un login unique.");
            }
        }
        
        // Hashage du mot de passe
        $passwordHash = password_hash($password, PASSWORD_DEFAULT);
        
        // Insertion de l'utilisateur (élève libre)
        $insertQuery = "INSERT INTO utilisateurs 
                        (login, mot_de_passe, nom, prenom, id_type, id_classe, actif)
                        VALUES (?, ?, ?, ?, 3, (SELECT id_classe FROM classes WHERE type_classe='soutien' LIMIT 1), 1)";
        
        $userId = $db->insert($insertQuery, [
            $login,
            $passwordHash,
            ucfirst(strtolower($nom)),
            ucfirst(strtolower($prenom))
        ]);
        
        // Récupération des infos complètes pour la session
        $userQuery = "SELECT u.*, t.libelle as type_libelle
                      FROM utilisateurs u
                      INNER JOIN types_utilisateurs t ON u.id_type = t.id_type
                      WHERE u.id_utilisateur = ?";
        
        $utilisateur = $db->fetchOne($userQuery, [$userId]);
        
        if (!$utilisateur) {
            throw new Exception("Erreur lors de la création du compte.");
        }
        
        // Connexion automatique après inscription
        SessionManager::login($utilisateur);
        
        // Message de succès
        $_SESSION['success'] = "Inscription réussie ! Bienvenue " . $utilisateur['prenom'] . " (login: " . $login . ")";
        
        // Redirection vers dashboard élève
        header('Location: eleve/dashboard.php');
        exit;
        
    } catch (Exception $e) {
        error_log("Erreur inscription libre : " . $e->getMessage());
        $_SESSION['error'] = "Erreur lors de l'inscription : " . $e->getMessage();
        header('Location: login.php');
        exit;
    }
}

// ==========================================
// CONNEXION CLASSIQUE
// ==========================================
else {
    
    // Récupération des données du formulaire
    $login = trim($_POST['login'] ?? '');
    $password = trim($_POST['password'] ?? '');
    
    // Validation basique
    if (empty($login) || empty($password)) {
        $_SESSION['error'] = "Veuillez remplir tous les champs.";
        header('Location: login.php');
        exit;
    }
    
    try {
        $db = Database::getInstance();
        
        // Recherche de l'utilisateur avec ses informations complètes
        $query = "SELECT u.*, 
                         t.libelle as type_libelle,
                         c.nom_classe,
                         c.niveau
                  FROM utilisateurs u
                  INNER JOIN types_utilisateurs t ON u.id_type = t.id_type
                  LEFT JOIN classes c ON u.id_classe = c.id_classe
                  WHERE u.login = ? AND u.actif = 1";
        
        $utilisateur = $db->fetchOne($query, [$login]);
        
        // Vérifier si l'utilisateur existe
        if (!$utilisateur) {
            $_SESSION['error'] = "Identifiant ou mot de passe incorrect.";
            header('Location: login.php');
            exit;
        }
        
        // Vérifier le mot de passe
        if (!password_verify($password, $utilisateur['mot_de_passe'])) {
            $_SESSION['error'] = "Identifiant ou mot de passe incorrect.";
            header('Location: login.php');
            exit;
        }
        
        // Créer la session
        SessionManager::login($utilisateur);
        
        // Redirection selon le type d'utilisateur
        if ($utilisateur['id_type'] == 1) {
            // Enseignant
            header('Location: enseignant/dashboard.php');
        } else {
            // Élève (classe ou libre)
            header('Location: eleve/dashboard.php');
        }
        exit;
        
    } catch (Exception $e) {
        error_log("Erreur connexion : " . $e->getMessage());
        $_SESSION['error'] = "Erreur lors de la connexion. Veuillez réessayer.";
        header('Location: login.php');
        exit;
    }
}

/**
 * Générer un login à partir du prénom et nom
 * Format : prenom.nom (minuscules, sans accents)
 */
function generateLogin($prenom, $nom) {
    // Conversion en minuscules
    $prenom = strtolower($prenom);
    $nom = strtolower($nom);
    
    // Suppression des accents
    $prenom = removeAccents($prenom);
    $nom = removeAccents($nom);
    
    // Suppression des caractères spéciaux (garder seulement lettres et chiffres)
    $prenom = preg_replace('/[^a-z0-9]/', '', $prenom);
    $nom = preg_replace('/[^a-z0-9]/', '', $nom);
    
    return $prenom . '.' . $nom;
}

/**
 * Supprimer les accents d'une chaîne
 */
function removeAccents($string) {
    $accents = [
        'à' => 'a', 'á' => 'a', 'â' => 'a', 'ã' => 'a', 'ä' => 'a',
        'è' => 'e', 'é' => 'e', 'ê' => 'e', 'ë' => 'e',
        'ì' => 'i', 'í' => 'i', 'î' => 'i', 'ï' => 'i',
        'ò' => 'o', 'ó' => 'o', 'ô' => 'o', 'õ' => 'o', 'ö' => 'o',
        'ù' => 'u', 'ú' => 'u', 'û' => 'u', 'ü' => 'u',
        'ý' => 'y', 'ÿ' => 'y',
        'ñ' => 'n', 'ç' => 'c'
    ];
    
    return strtr($string, $accents);
}
