const authService = require('../services/AuthService');

/**
 * Authentication Middleware
 * Validiert JWT-Token und fügt Benutzer-Info zu req hinzu
 */
const authenticateToken = async (req, res, next) => {
  try {
    // Token aus Authorization-Header extrahieren
    const authHeader = req.headers['authorization'];
    const token = authHeader && authHeader.split(' ')[1]; // Bearer TOKEN

    if (!token) {
      return res.status(401).json({
        success: false,
        error: 'Kein Token vorhanden',
        code: 'NO_TOKEN'
      });
    }

    // Token validieren
    const decoded = await authService.validateToken(token);
    
    // Benutzer-Info zu Request hinzufügen
    req.user = decoded;
    
    next();
  } catch (error) {
    console.error('Auth-Middleware-Fehler:', error.message);
    
    return res.status(401).json({
      success: false,
      error: 'Ungültiger oder abgelaufener Token',
      code: 'INVALID_TOKEN'
    });
  }
};

/**
 * Optional Authentication Middleware
 * Validiert Token falls vorhanden, erlaubt aber auch Requests ohne Token
 */
const optionalAuth = async (req, res, next) => {
  try {
    const authHeader = req.headers['authorization'];
    const token = authHeader && authHeader.split(' ')[1];

    if (token) {
      const decoded = await authService.validateToken(token);
      req.user = decoded;
    }
    
    next();
  } catch (error) {
    // Bei optionalem Auth ignorieren wir Fehler
    next();
  }
};

module.exports = {
  authenticateToken,
  optionalAuth
};



