const database = require('../config/database');

/**
 * Service-Klasse für Urlaubseinträge
 * Enthält die gesamte Business-Logik für Vacation
 */
class VacationService {
  constructor() {
    this.defaultUserId = 1;
  }

  /**
   * Holt alle Urlaubseinträge für einen User
   * Zeigt nur aktuelles Jahr oder letzte 3 Monate (falls wir in den ersten 3 Monaten sind)
   * @param {number} userId - Benutzer-ID
   * @returns {Promise<Array>} Array von Urlaubseinträgen
   */
  async getAllVacations(userId) {
    const { Vacation } = database.getModels();
    const { Op } = require('sequelize');
    
    const now = new Date();
    const currentYear = now.getFullYear();
    const currentMonth = now.getMonth(); // 0-11
    
    let startDate;
    
    if (currentMonth < 3) {
      // Erste 3 Monate des Jahres: Zeige letzte 3 Monate
      const threeMonthsAgo = new Date(now);
      threeMonthsAgo.setMonth(now.getMonth() - 3);
      startDate = `${threeMonthsAgo.getFullYear()}-${String(threeMonthsAgo.getMonth() + 1).padStart(2, '0')}-01`;
    } else {
      // Rest des Jahres: Zeige nur aktuelles Jahr
      startDate = `${currentYear}-01-01`;
    }
    
    const vacations = await Vacation.findAll({
      where: {
        user_id: userId,
        first_day: {
          [Op.gte]: startDate
        }
      },
      order: [['first_day', 'DESC']],
      raw: true
    });
    
    // Formatiere die Daten
    return vacations.map(vac => ({
      id: vac.id,
      type: vac.vacation_type === 1 ? 'Halber Tag' : 'Zeitraum',
      typeValue: vac.vacation_type,
      startDate: vac.first_day,
      endDate: vac.last_day
    }));
  }

  /**
   * Erstellt einen neuen Urlaubseintrag
   * @param {number} userId - Benutzer-ID
   * @param {number} vacationType - Typ (0 = Zeitraum, 1 = Halber Tag)
   * @param {string} startDate - Startdatum (YYYY-MM-DD)
   * @param {string} endDate - Enddatum (YYYY-MM-DD)
   * @returns {Promise<Object>} Erstellter Urlaubseintrag
   */
  async createVacation(userId, vacationType, startDate, endDate) {
    const { Vacation } = database.getModels();
    
    // Bei "Halber Tag" muss startDate = endDate sein
    let finalEndDate = endDate;
    if (vacationType === 1) {
      finalEndDate = startDate;
    } else if (!endDate) {
      throw new Error('Urlaubsende ist erforderlich für Zeitraum');
    }
    
    const vacation = await Vacation.create({
      user_id: userId,
      first_day: startDate,
      last_day: finalEndDate,
      vacation_type: vacationType,
      version: 0
    });
    
    return {
      id: vacation.id,
      type: vacationType === 1 ? 'Halber Tag' : 'Zeitraum',
      typeValue: vacation.vacation_type,
      startDate: vacation.first_day,
      endDate: vacation.last_day
    };
  }

  /**
   * Löscht einen Urlaubseintrag
   * @param {number} userId - Benutzer-ID
   * @param {number} vacationId - Vacation-ID
   * @returns {Promise<void>}
   */
  async deleteVacation(userId, vacationId) {
    const { Vacation } = database.getModels();
    
    const vacation = await Vacation.findByPk(vacationId);
    
    if (!vacation) {
      throw new Error('Urlaubseintrag nicht gefunden');
    }
    
    // Prüfe Berechtigung
    if (vacation.user_id !== userId) {
      throw new Error('Keine Berechtigung für diesen Eintrag');
    }
    
    await vacation.destroy();
  }
}

module.exports = new VacationService();

