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

/**
 * Middleware zum automatischen Hashen von IDs in Response-Daten
 */
const hashResponseIds = (req, res, next) => {
  // Originale json-Methode speichern
  const originalJson = res.json.bind(res);

  // json-Methode überschreiben
  res.json = function(data) {
    // Wenn Daten vorhanden sind, IDs hashen
    if (data) {
      data = hashResponseData(data);
    }

    // Originale Methode aufrufen
    return originalJson(data);
  };

  next();
};

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

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

  // Object: ID-Felder hashen
  if (typeof data === 'object') {
    const result = {};

    for (const [key, value] of Object.entries(data)) {
      // ID-Felder identifizieren und hashen
      if (isIdField(key) && typeof value === 'number') {
        result[key] = hashId.encode(value);
      }
      // Verschachtelte Objekte/Arrays rekursiv verarbeiten
      else if (typeof value === 'object') {
        result[key] = hashResponseData(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 = hashResponseIds;



