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

/**
 * Authentication Controller
 * Verwaltet Auth-bezogene HTTP-Requests
 */
class AuthController {
  /**
   * Benutzer registrieren
   * POST /api/auth/register
   */
  async register(req, res) {
    try {
      const { email, password, full_name } = req.body;

      const result = await authService.register({
        email,
        password,
        full_name
      });

      res.status(201).json({
        success: true,
        message: 'Registrierung erfolgreich',
        user: result.user
      });
    } catch (error) {
      console.error('Registrierungsfehler:', error);
      
      res.status(400).json({
        success: false,
        error: error.message
      });
    }
  }

  /**
   * Benutzer einloggen
   * POST /api/auth/login
   */
  async login(req, res) {
    try {
      const { email, password, action } = req.body;

      if (!email || !password) {
        return res.status(400).json({
          success: false,
          error: 'E-Mail und Passwort sind erforderlich'
        });
      }

      const result = await authService.login(email, password, action);

      const response = {
        success: true,
        message: 'Login erfolgreich',
        token: result.token,
        user: result.user
      };

      // Füge Warnung hinzu, falls vorhanden
      if (result.actionWarning) {
        response.actionWarning = result.actionWarning;
      }

      res.json(response);
    } catch (error) {
      console.error('Login-Fehler:', error);
      
      res.status(401).json({
        success: false,
        error: error.message
      });
    }
  }

  /**
   * Ausloggen
   * POST /api/auth/logout
   */
  async logout(req, res) {
    try {
      const token = req.headers.authorization?.replace('Bearer ', '');

      if (token) {
        await authService.logout(token);
      }

      res.json({
        success: true,
        message: 'Logout erfolgreich'
      });
    } catch (error) {
      console.error('Logout-Fehler:', error);
      
      res.status(500).json({
        success: false,
        error: 'Fehler beim Logout'
      });
    }
  }

  /**
   * Aktuellen Benutzer abrufen
   * GET /api/auth/me
   */
  async getCurrentUser(req, res) {
    try {
      const userId = req.user.userId;

      const profile = await authService.getUserProfile(userId);

      res.json({
        success: true,
        user: profile
      });
    } catch (error) {
      console.error('Fehler beim Abrufen des Benutzers:', error);
      
      res.status(500).json({
        success: false,
        error: 'Fehler beim Abrufen der Benutzerdaten'
      });
    }
  }

  /**
   * Passwort-Reset anfordern
   * POST /api/auth/request-reset
   */
  async requestPasswordReset(req, res) {
    try {
      const { email } = req.body;

      if (!email) {
        return res.status(400).json({
          success: false,
          error: 'E-Mail ist erforderlich'
        });
      }

      const resetToken = await authService.requestPasswordReset(email);

      // Debug-Logs
      console.log('Reset-Token:', resetToken);
      console.log('NODE_ENV:', process.env.NODE_ENV);
      console.log('isDevelopment:', !process.env.NODE_ENV || process.env.NODE_ENV === 'development');

      // In Produktion: E-Mail mit Reset-Link senden
      // Für Entwicklung: Token zurückgeben (auch wenn E-Mail nicht existiert)
      const isDevelopment = !process.env.NODE_ENV || process.env.NODE_ENV === 'development';
      
      if (isDevelopment) {
        // Im Development-Modus immer einen Token zurückgeben für Testing
        const devToken = resetToken || 'dev-test-token-' + Date.now() + '-' + email;
        res.json({
          success: true,
          message: 'Reset-Link wurde gesendet (DEV)',
          resetToken: devToken // NUR FÜR ENTWICKLUNG!
        });
      } else {
        res.json({
          success: true,
          message: 'Falls ein Account mit dieser E-Mail existiert, wurde ein Reset-Link gesendet'
        });
      }
    } catch (error) {
      console.error('Fehler bei Passwort-Reset-Anfrage:', error);
      
      res.status(500).json({
        success: false,
        error: 'Fehler beim Senden des Reset-Links'
      });
    }
  }

  /**
   * Passwort zurücksetzen
   * POST /api/auth/reset-password
   */
  async resetPassword(req, res) {
    try {
      const { token, password } = req.body;

      if (!token || !password) {
        return res.status(400).json({
          success: false,
          error: 'Token und neues Passwort sind erforderlich'
        });
      }

      await authService.resetPassword(token, password);

      res.json({
        success: true,
        message: 'Passwort wurde erfolgreich zurückgesetzt'
      });
    } catch (error) {
      console.error('Fehler beim Passwort-Reset:', error);
      
      res.status(400).json({
        success: false,
        error: error.message
      });
    }
  }

  /**
   * Passwort ändern (eingeloggter Benutzer)
   * POST /api/auth/change-password
   */
  async changePassword(req, res) {
    try {
      const userId = req.user.userId;
      const { oldPassword, newPassword } = req.body;

      if (!oldPassword || !newPassword) {
        return res.status(400).json({
          success: false,
          error: 'Altes und neues Passwort sind erforderlich'
        });
      }

      await authService.changePassword(userId, oldPassword, newPassword);

      res.json({
        success: true,
        message: 'Passwort wurde erfolgreich geändert'
      });
    } catch (error) {
      console.error('Fehler beim Passwort-Ändern:', error);
      
      res.status(400).json({
        success: false,
        error: error.message
      });
    }
  }

  /**
   * Token validieren
   * GET /api/auth/validate
   */
  async validateToken(req, res) {
    try {
      // Wenn Middleware durchgelaufen ist, ist Token valid
      res.json({
        success: true,
        valid: true,
        user: req.user
      });
    } catch (error) {
      res.status(401).json({
        success: false,
        valid: false,
        error: 'Ungültiger Token'
      });
    }
  }
}

module.exports = new AuthController();

