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

/**
 * Service-Klasse für Watcher (Berechtigungen)
 * Verwaltet, wer die Arbeitszeiten eines Users sehen darf
 */
class WatcherService {
  /**
   * Holt alle Watcher eines Users
   * @param {number} userId - User-ID
   * @returns {Promise<Array>} Array von Watchern
   */
  async getWatchers(userId) {
    const { Watcher } = database.getModels();
    
    const watchers = await Watcher.findAll({
      where: {
        user_id: userId,
        is_active: true
      },
      order: [['created_at', 'DESC']],
      raw: true
    });
    
    return watchers.map(w => ({
      id: w.id,
      email: w.watcher_email,
      createdAt: w.created_at ? new Date(w.created_at).toISOString() : null
    }));
  }

  /**
   * Fügt einen Watcher hinzu
   * @param {number} userId - User-ID
   * @param {string} watcherEmail - Email-Adresse des Watchers
   * @returns {Promise<Object>} Erstellter Watcher
   */
  async addWatcher(userId, watcherEmail) {
    const { Watcher } = database.getModels();
    
    // Validiere Email
    if (!watcherEmail || !this._isValidEmail(watcherEmail)) {
      throw new Error('Ungültige Email-Adresse');
    }
    
    // Prüfe ob bereits existiert
    const existing = await Watcher.findOne({
      where: {
        user_id: userId,
        watcher_email: watcherEmail
      }
    });
    
    if (existing) {
      if (existing.is_active) {
        throw new Error('Diese Email-Adresse ist bereits als Beobachter eingetragen');
      } else {
        // Reaktiviere inaktiven Watcher
        existing.is_active = true;
        await existing.save();
        return {
          id: existing.id,
          email: existing.watcher_email,
          createdAt: existing.created_at
        };
      }
    }
    
    // Erstelle neuen Watcher
    const watcher = await Watcher.create({
      user_id: userId,
      watcher_email: watcherEmail,
      is_active: true,
      created_at: new Date()
    });
    
    return {
      id: watcher.id,
      email: watcher.watcher_email,
      createdAt: watcher.created_at
    };
  }

  /**
   * Entfernt einen Watcher (soft delete)
   * @param {number} userId - User-ID
   * @param {number} watcherId - Watcher-ID
   * @returns {Promise<void>}
   */
  async removeWatcher(userId, watcherId) {
    const { Watcher } = database.getModels();
    
    const watcher = await Watcher.findByPk(watcherId);
    
    if (!watcher) {
      throw new Error('Beobachter nicht gefunden');
    }
    
    // Prüfe Berechtigung
    if (watcher.user_id !== userId) {
      throw new Error('Keine Berechtigung für diesen Eintrag');
    }
    
    // Soft delete: Setze is_active auf false
    watcher.is_active = false;
    await watcher.save();
  }

  /**
   * Prüft ob eine Email die Arbeitszeiten eines Users sehen darf
   * @param {number} userId - User-ID
   * @param {string} watcherEmail - Email-Adresse des Watchers
   * @returns {Promise<boolean>} True wenn berechtigt
   */
  async canWatch(userId, watcherEmail) {
    const { Watcher } = database.getModels();
    
    const watcher = await Watcher.findOne({
      where: {
        user_id: userId,
        watcher_email: watcherEmail,
        is_active: true
      }
    });
    
    return !!watcher;
  }

  /**
   * Validiert Email-Format
   */
  _isValidEmail(email) {
    const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
    return emailRegex.test(email);
  }
}

module.exports = new WatcherService();

