const hashId = require('../utils/hashId');

/**
 * Middleware zum automatischen Enthashen von IDs in Request-Daten
 */
const unhashRequestIds = (req, res, next) => {
  // Body-Parameter verarbeiten
  if (req.body && typeof req.body === 'object') {
    req.body = unhashRequestData(req.body);
  }

  // Query-Parameter verarbeiten
  if (req.query && typeof req.query === 'object') {
    req.query = unhashRequestData(req.query);
  }

  // Route-Parameter verarbeiten
  if (req.params && typeof req.params === 'object') {
    req.params = unhashRequestData(req.params);
  }

  next();
};

/**
 * Rekursiv Hash-IDs in Datenstruktur entschlüsseln
 * @param {*} data - Zu verarbeitende Daten
 * @returns {*} Daten mit entschlüsselten IDs
 */
function unhashRequestData(data) {
  // Primitive Typen direkt zurückgeben
  if (data === null || data === undefined) {
    return data;
  }

  // String: Könnte ein Hash sein
  if (typeof data === 'string') {
    // Versuche als Hash zu dekodieren
    const decoded = hashId.decode(data);
    if (decoded !== null) {
      return decoded;
    }
    return data;
  }

  // Array: Jedes Element verarbeiten
  if (Array.isArray(data)) {
    return data.map(item => unhashRequestData(item));
  }

  // Object: Rekursiv verarbeiten
  if (typeof data === 'object') {
    const result = {};

    for (const [key, value] of Object.entries(data)) {
      // ID-Felder identifizieren und enthashen
      if (isIdField(key) && typeof value === 'string') {
        const decoded = hashId.decode(value);
        result[key] = decoded !== null ? decoded : value;
      }
      // Verschachtelte Objekte/Arrays rekursiv verarbeiten
      else if (typeof value === 'object') {
        result[key] = unhashRequestData(value);
      }
      // Andere Werte unverändert übernehmen
      else {
        result[key] = value;
      }
    }

    return result;
  }

  // Andere Typen unverändert
  return data;
}

/**
 * Prüft ob ein Feldname eine ID repräsentiert
 * @param {string} fieldName - Name des Feldes
 * @returns {boolean} True wenn ID-Feld
 */
function isIdField(fieldName) {
  // Felder die als ID erkannt werden sollen
  const idPatterns = [
    'id',
    '_id',
    'user_id',
    'userId',
    'auth_info_id',
    'authInfoId',
    'auth_token_id',
    'authTokenId',
    'worklog_id',
    'worklogId',
    'vacation_id',
    'vacationId',
    'sick_id',
    'sickId',
    'holiday_id',
    'holidayId',
    'state_id',
    'stateId',
    'sick_type_id',
    'sickTypeId',
    'weekly_worktime_id',
    'weeklyWorktimeId'
  ];

  return idPatterns.includes(fieldName);
}

module.exports = unhashRequestIds;



