import express from 'express';
import { verifyCredentials, changeUserPassword } from '../utils/userStore.js';
import apiLimiter, { loginLimiter } from '../utils/rateLimiter.js';
import authMiddleware from '../utils/authMiddleware.js';

const router = express.Router();

// ============================================================
//  POST /login — Authentification username + password
// ============================================================

router.post('/api/login', loginLimiter, (req, res) => {
    const { username, password } = req.body;

    // Validation basique des inputs
    if (!username || typeof username !== 'string') {
        return res.status(400).json({ error: "Nom d'utilisateur manquant." });
    }
    if (!password || typeof password !== 'string') {
        return res.status(400).json({ error: "Mot de passe manquant." });
    }

    // Limiter la taille du password pour éviter un DoS scrypt (max 128 chars)
    if (password.length > 128) {
        return res.status(400).json({ error: "Mot de passe trop long." });
    }

    try {
        const user = verifyCredentials(username, password);

        if (user) {
            // Session regeneration — anti session fixation
            const oldSession = req.session as any;
            req.session.regenerate((err) => {
                if (err) {
                    console.error('[Auth] Erreur session.regenerate:', err);
                    return res.status(500).json({ error: "Erreur interne du serveur." });
                }

                // Stocker les infos user dans la nouvelle session
                (req.session as any).user = {
                    id: user.id,
                    username: user.username,
                    role: user.role,
                    loginAt: new Date().toISOString(),
                    mustChangePassword: user.mustChangePassword || false,
                    preferences: user.preferences || {},
                };

                console.log(`[Auth] Connexion réussie: ${user.username} (${user.role}) depuis ${req.ip}`);
                res.json({ 
                    success: true, 
                    mustChangePassword: user.mustChangePassword || false,
                    user: { username: user.username, role: user.role } 
                });
            });
        } else {
            // Message générique — anti user-enumeration (jamais "utilisateur inconnu" vs "mauvais mdp")
            setTimeout(() => {
                console.warn(`[Auth] Tentative échouée pour "${username}" depuis ${req.ip}`);
                res.status(401).json({ error: "Identifiants invalides." });
            }, 500);
        }
    } catch (e) {
        console.error('[Auth] Erreur login:', e);
        res.status(500).json({ error: "Erreur interne du serveur." });
    }
});

// ============================================================
//  POST /change-password — Changement de mot de passe (obligatoire ou non)
// ============================================================

router.post('/api/change-password', apiLimiter, authMiddleware, (req, res) => {
    const session = req.session as any;

    const { newPassword } = req.body;
    if (!newPassword || typeof newPassword !== 'string') {
        return res.status(400).json({ error: "Le nouveau mot de passe est obligatoire." });
    }

    try {
        changeUserPassword(session.user.id, newPassword);

        // Mettre à jour la session
        session.user.mustChangePassword = false;
        // Important: Mettre à jour loginAt car le passwordChangedAt a changé, pour éviter d'invalider la session
        session.user.loginAt = new Date().toISOString();

        console.log(`[Auth] Mot de passe changé avec succès pour ${session.user.username}`);
        res.json({ success: true, message: "Mot de passe modifié avec succès." });
    } catch (error: any) {
        res.status(400).json({ error: error.message });
    }
});

// ============================================================
//  GET /check-session — Vérifie l'état de la session
// ============================================================

router.get('/api/check-session', apiLimiter, (req, res) => {
    const session = req.session as any;
    if (session.user) {
        res.json({
            isLoggedIn: true,
            user: {
                username: session.user.username,
                role: session.user.role,
                mustChangePassword: session.user.mustChangePassword || false,
                preferences: session.user.preferences || {},
            }
        });
    } else {
        res.json({ isLoggedIn: false });
    }
});

// ============================================================
//  POST /logout — Déconnexion
// ============================================================

router.post('/api/logout', apiLimiter, (req, res) => {
    req.session.destroy(err => {
        if (err) return res.status(500).json({ error: "Échec de la déconnexion." });
        res.clearCookie('connect.sid');
        res.json({ success: true });
    });
});

export default router;
