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

/**
 * Service-Klasse für Rollen-Verwaltung
 * Nur für Admins: Verwaltet User-Rollen
 */
class RolesService {
  /**
   * Holt alle Benutzer mit ihren Rollen
   * @returns {Promise<Array>} Array von Benutzern
   */
  async getAllUsers() {
    const { User, State } = database.getModels();
    
    const users = await User.findAll({
      include: [
        {
          model: State,
          as: 'state',
          attributes: ['state_name'],
          required: false
        }
      ],
      order: [['full_name', 'ASC']]
    });
    
    return users.map(u => ({
      id: u.id,
      fullName: u.full_name,
      role: u.role, // 0 = user, 1 = admin
      roleString: u.role === 1 ? 'admin' : 'user',
      stateName: u.state?.state_name || null
    }));
  }

  /**
   * Ändert die Rolle eines Benutzers
   * @param {number} adminUserId - ID des Admins, der die Änderung vornimmt
   * @param {number} targetUserId - ID des zu ändernden Users
   * @param {number} newRole - Neue Rolle (0 = user, 1 = admin)
   * @returns {Promise<Object>} Aktualisierter User
   */
  async updateUserRole(adminUserId, targetUserId, newRole) {
    const { User } = database.getModels();
    
    // Prüfe ob Admin
    const admin = await User.findByPk(adminUserId);
    if (!admin || admin.role !== 1) {
      throw new Error('Keine Berechtigung für diese Aktion');
    }
    
    // Validierung
    if (newRole !== 0 && newRole !== 1) {
      throw new Error('Ungültige Rolle (muss 0 oder 1 sein)');
    }
    
    // Hole Ziel-User
    const targetUser = await User.findByPk(targetUserId);
    
    if (!targetUser) {
      throw new Error('Benutzer nicht gefunden');
    }
    
    // Verhindere, dass der einzige Admin sich selbst degradiert
    if (targetUserId === adminUserId && newRole === 0) {
      const adminCount = await User.count({
        where: { role: 1 }
      });
      
      if (adminCount <= 1) {
        throw new Error('Sie können sich nicht selbst degradieren, wenn Sie der einzige Admin sind');
      }
    }
    
    // Aktualisiere Rolle
    targetUser.role = newRole;
    await targetUser.save();
    
    console.log(`Admin ${adminUserId} hat User ${targetUserId} Rolle auf ${newRole} geändert`);
    
    return {
      id: targetUser.id,
      fullName: targetUser.full_name,
      role: targetUser.role,
      roleString: targetUser.role === 1 ? 'admin' : 'user'
    };
  }
}

module.exports = new RolesService();

