/**
 * Утилита для управления ревизиями схемы формы
 * Сохраняет предыдущие версии перед деструктивными операциями
 */

const REVISION_STORAGE_KEY = 'formBuilder_revisions';
const MAX_REVISIONS = 10;

/**
 * Сохраняет ревизию схемы перед деструктивной операцией
 * @param {string} formAlias - Алиас формы (например, 'checkout')
 * @param {Array} schema - Схема формы для сохранения
 * @param {string} reason - Причина сохранения (например, 'reset_to_visual')
 */
export function saveRevision(formAlias, schema, reason = 'unknown') {
  try {
    const revisions = getRevisions(formAlias);
    const revision = {
      id: `rev_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`,
      schema: JSON.parse(JSON.stringify(schema)), // Deep clone
      timestamp: new Date().toISOString(),
      reason,
    };

    revisions.unshift(revision);

    // Ограничиваем количество ревизий
    if (revisions.length > MAX_REVISIONS) {
      revisions.splice(MAX_REVISIONS);
    }

    const storage = getAllRevisions();
    storage[formAlias] = revisions;
    localStorage.setItem(REVISION_STORAGE_KEY, JSON.stringify(storage));
  } catch (error) {
    console.error('Ошибка сохранения ревизии:', error);
  }
}

/**
 * Получает все ревизии для формы
 * @param {string} formAlias - Алиас формы
 * @returns {Array} Массив ревизий
 */
export function getRevisions(formAlias) {
  try {
    const storage = getAllRevisions();
    return storage[formAlias] || [];
  } catch (error) {
    console.error('Ошибка получения ревизий:', error);
    return [];
  }
}

/**
 * Получает все ревизии для всех форм
 * @returns {Object} Объект с ревизиями по алиасам форм
 */
function getAllRevisions() {
  try {
    const stored = localStorage.getItem(REVISION_STORAGE_KEY);
    return stored ? JSON.parse(stored) : {};
  } catch (error) {
    console.error('Ошибка чтения ревизий из localStorage:', error);
    return {};
  }
}

/**
 * Восстанавливает схему из ревизии
 * @param {string} formAlias - Алиас формы
 * @param {string} revisionId - ID ревизии
 * @returns {Array|null} Схема формы или null, если ревизия не найдена
 */
export function restoreRevision(formAlias, revisionId) {
  try {
    const revisions = getRevisions(formAlias);
    const revision = revisions.find(r => r.id === revisionId);
    if (revision) {
      return JSON.parse(JSON.stringify(revision.schema)); // Deep clone
    }
    return null;
  } catch (error) {
    console.error('Ошибка восстановления ревизии:', error);
    return null;
  }
}

/**
 * Удаляет ревизию
 * @param {string} formAlias - Алиас формы
 * @param {string} revisionId - ID ревизии
 */
export function deleteRevision(formAlias, revisionId) {
  try {
    const revisions = getRevisions(formAlias);
    const filtered = revisions.filter(r => r.id !== revisionId);
    const storage = getAllRevisions();
    storage[formAlias] = filtered;
    localStorage.setItem(REVISION_STORAGE_KEY, JSON.stringify(storage));
  } catch (error) {
    console.error('Ошибка удаления ревизии:', error);
  }
}

/**
 * Очищает все ревизии для формы
 * @param {string} formAlias - Алиас формы
 */
export function clearRevisions(formAlias) {
  try {
    const storage = getAllRevisions();
    delete storage[formAlias];
    localStorage.setItem(REVISION_STORAGE_KEY, JSON.stringify(storage));
  } catch (error) {
    console.error('Ошибка очистки ревизий:', error);
  }
}

