import taxiHighscoreService from '../services/taxiHighscoreService.js';

class TaxiHighscoreController {
  /**
   * Erstellt oder aktualisiert einen Highscore-Eintrag
   */
  async createHighscore(req, res) {
    try {
      const { userId, nickname, passengersDelivered, playtime, points, mapId, mapName } = req.body;

      // Validierung der erforderlichen Felder
      if (!userId || !nickname || passengersDelivered === undefined || playtime === undefined || points === undefined || !mapId || !mapName) {
        return res.status(400).json({
          success: false,
          message: 'Alle Felder sind erforderlich: userId, nickname, passengersDelivered, playtime, points, mapId, mapName'
        });
      }

      const highscoreData = {
        hashedUserId: userId, // userId ist bereits ein String (Hash)
        nickname,
        passengersDelivered: parseInt(passengersDelivered),
        playtime: parseInt(playtime),
        points: parseInt(points),
        mapId: parseInt(mapId),
        mapName
      };

      const highscore = await taxiHighscoreService.createHighscore(highscoreData);

      res.status(200).json({
        success: true,
        data: highscore,
        message: 'Highscore erfolgreich gespeichert'
      });
    } catch (error) {
      console.error('Fehler beim Erstellen des Highscores:', error);
      res.status(500).json({
        success: false,
        message: 'Fehler beim Speichern des Highscores',
        error: error.message
      });
    }
  }

  /**
   * Holt die Top-Highscores
   */
  async getTopHighscores(req, res) {
    try {
      const { mapId, limit = 10, orderBy = 'points' } = req.query;

      const highscores = await taxiHighscoreService.getTopHighscores(
        mapId ? parseInt(mapId) : null,
        parseInt(limit),
        orderBy
      );

      res.status(200).json({
        success: true,
        data: highscores
      });
    } catch (error) {
      console.error('Fehler beim Laden der Top-Highscores:', error);
      res.status(500).json({
        success: false,
        message: 'Fehler beim Laden der Highscores',
        error: error.message
      });
    }
  }

  /**
   * Holt die persönlichen Bestleistungen eines Users
   */
  async getUserBestScores(req, res) {
    try {
      const { userId, mapId } = req.query;

      if (!userId) {
        return res.status(400).json({
          success: false, 
          message: 'userId ist erforderlich'
        });
      }

      const bestScores = await taxiHighscoreService.getUserBestScores(
        userId, // userId ist bereits ein String (Hash)
        mapId ? parseInt(mapId) : null
      );

      res.status(200).json({
        success: true,
        data: bestScores
      });
    } catch (error) {
      console.error('Fehler beim Laden der User-Bestleistungen:', error);
      res.status(500).json({
        success: false,
        message: 'Fehler beim Laden der Bestleistungen',
        error: error.message
      });
    }
  }

  /**
   * Holt alle Highscores eines Users
   */
  async getUserHighscores(req, res) {
    try {
      const { userId, limit = 20 } = req.query;

      if (!userId) {
        return res.status(400).json({
          success: false,
          message: 'userId ist erforderlich'
        });
      }

      const highscores = await taxiHighscoreService.getUserHighscores(
        userId, // userId ist bereits ein String (Hash)
        parseInt(limit)
      );

      res.status(200).json({
        success: true,
        data: highscores
      });
    } catch (error) {
      console.error('Fehler beim Laden der User-Highscores:', error);
      res.status(500).json({
        success: false,
        message: 'Fehler beim Laden der User-Highscores',
        error: error.message
      });
    }
  }

  /**
   * Holt die Rangliste-Position eines Users
   */
  async getUserRank(req, res) {
    try {
      const { userId, mapId, orderBy = 'points' } = req.query;

      if (!userId) {
        return res.status(400).json({
          success: false,
          message: 'userId ist erforderlich'
        });
      }

      const rank = await taxiHighscoreService.getUserRank(
        userId, // userId ist bereits ein String (Hash)
        mapId ? parseInt(mapId) : null,
        orderBy
      );

      res.status(200).json({
        success: true,
        data: { rank }
      });
    } catch (error) {
      console.error('Fehler beim Berechnen der User-Rangliste:', error);
      res.status(500).json({
        success: false,
        message: 'Fehler beim Berechnen der Rangliste',
        error: error.message
      });
    }
  }

  /**
   * Holt Statistiken über die Highscores
   */
  async getHighscoreStats(req, res) {
    try {
      const stats = await taxiHighscoreService.getHighscoreStats();

      res.status(200).json({
        success: true,
        data: stats
      });
    } catch (error) {
      console.error('Fehler beim Laden der Highscore-Statistiken:', error);
      res.status(500).json({
        success: false,
        message: 'Fehler beim Laden der Statistiken',
        error: error.message
      });
    }
  }
}

export default new TaxiHighscoreController();
