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

/**
 * Service-Klasse für Benutzer-Profil-Einstellungen
 */
class ProfileService {
  /**
   * Holt das Benutzerprofil
   * @param {number} userId - Benutzer-ID
   * @returns {Promise<Object>} Profildaten
   */
  async getProfile(userId) {
    const { User, State, AuthInfo } = database.getModels();
    
    const user = await User.findByPk(userId, {
      include: [
        {
          model: State,
          as: 'state',
          attributes: ['id', 'state_name']
        },
        {
          model: AuthInfo,
          as: 'authInfo',
          attributes: ['email']
        }
      ]
    });
    
    if (!user) {
      throw new Error('Benutzer nicht gefunden');
    }
    
    return {
      id: user.id,
      fullName: user.full_name,
      email: user.authInfo?.email || null,
      stateId: user.state_id,
      stateName: user.state?.state_name || null,
      weekWorkdays: user.week_workdays,
      dailyHours: user.daily_hours,
      preferredTitleType: user.preferred_title_type
    };
  }

  /**
   * Aktualisiert das Benutzerprofil
   * @param {number} userId - Benutzer-ID
   * @param {Object} updates - Zu aktualisierende Felder
   * @returns {Promise<Object>} Aktualisierte Profildaten
   */
  async updateProfile(userId, updates) {
    const { User, State } = database.getModels();
    
    const user = await User.findByPk(userId);
    
    if (!user) {
      throw new Error('Benutzer nicht gefunden');
    }
    
    // Aktualisiere erlaubte Felder
    if (updates.fullName !== undefined) {
      user.full_name = updates.fullName;
    }
    
    if (updates.stateId !== undefined) {
      // Prüfe ob State existiert
      if (updates.stateId) {
        const state = await State.findByPk(updates.stateId);
        if (!state) {
          throw new Error('Ungültiges Bundesland');
        }
      }
      user.state_id = updates.stateId;
    }
    
    if (updates.weekWorkdays !== undefined) {
      if (updates.weekWorkdays < 1 || updates.weekWorkdays > 7) {
        throw new Error('Arbeitstage pro Woche müssen zwischen 1 und 7 liegen');
      }
      user.week_workdays = updates.weekWorkdays;
    }
    
    if (updates.dailyHours !== undefined) {
      if (updates.dailyHours < 1 || updates.dailyHours > 24) {
        throw new Error('Tägliche Arbeitsstunden müssen zwischen 1 und 24 liegen');
      }
      user.daily_hours = updates.dailyHours;
    }
    
    if (updates.preferredTitleType !== undefined) {
      if (updates.preferredTitleType < 0 || updates.preferredTitleType > 7) {
        throw new Error('Ungültiger Seitentitel-Typ');
      }
      user.preferred_title_type = updates.preferredTitleType;
    }
    
    await user.save();
    
    // Lade aktualisiertes Profil
    return this.getProfile(userId);
  }

  /**
   * Holt alle verfügbaren Bundesländer
   * @returns {Promise<Array>} Array von States
   */
  async getAllStates() {
    const { State } = database.getModels();
    
    const states = await State.findAll({
      order: [['state_name', 'ASC']],
      raw: true
    });
    
    return states.map(s => ({
      id: s.id,
      name: s.state_name
    }));
  }
}

module.exports = new ProfileService();

