import { inject, ref } from 'vue';

/**
 * Composable для работы с полями формы
 */
export function useFormFields() {
  const formFields = inject('formFields');
  const selectedFieldId = inject('selectedFieldId');
  
  // Глобальное состояние ошибок полей { [fieldId]: 'Текст ошибки' }
  // Используем provide/inject если нужно шарить между компонентами, но пока можно и локально, 
  // если этот composable используется в provide в родителе.
  // В данном случае мы просто добавим ref, но так как composable вызывается в разных местах,
  // состояние не будет общим. Нужно вынести состояние выше или использовать provide/inject для ошибок.
  // Но для простоты, раз у нас FormBuilder провайдит formFields, добавим и errors туда.
  
  const fieldErrors = inject('fieldErrors', ref({}));

  /**
   * Выбирает поле по ID
   */
  function selectField(fieldId) {
    if (selectedFieldId) {
      selectedFieldId.value = fieldId;
    }
  }
  
  /**
   * Устанавливает ошибку для поля
   */
  function setFieldError(fieldId, error) {
    if (!fieldErrors.value) return;
    if (error) {
      fieldErrors.value[fieldId] = error;
    } else {
      delete fieldErrors.value[fieldId];
    }
  }

  /**
   * Удаляет поле по ID
   */
  function removeField(fieldId) {
    if (!formFields || !formFields.value) return;
    
    formFields.value = formFields.value.filter(f => f.id !== fieldId);
    
    // Очищаем ошибку при удалении
    if (fieldErrors.value[fieldId]) {
        delete fieldErrors.value[fieldId];
    }
    
    if (selectedFieldId && selectedFieldId.value === fieldId) {
      selectedFieldId.value = null;
    }
  }

  /**
   * Перемещает поле вверх или вниз (больше не нужно с vuedraggable, но оставим для совместимости/ручного управления)
   */
  function moveField(index, direction) {
    if (!formFields || !formFields.value) return;
    
    const newFields = [...formFields.value];
    if (direction === 'up' && index > 0) {
      [newFields[index], newFields[index - 1]] = 
      [newFields[index - 1], newFields[index]];
      formFields.value = newFields;
    } else if (direction === 'down' && index < newFields.length - 1) {
      [newFields[index], newFields[index + 1]] = 
      [newFields[index + 1], newFields[index]];
      formFields.value = newFields;
    }
  }
  
  /**
   * Генерирует уникальный ID для поля
   */
  function generateFieldId() {
    let maxId = 0;
    if (formFields && formFields.value) {
      formFields.value.forEach(field => {
        const match = field.id?.match(/field_(\d+)/);
        if (match) {
          const idNum = parseInt(match[1]);
          if (idNum > maxId) maxId = idNum;
        }
      });
    }
    
    return `field_${maxId + 1}_${Date.now()}`;
  }

  /**
   * Проверяет, уникально ли имя поля
   */
  function isFieldNameUnique(name, excludeId = null) {
    if (!formFields || !formFields.value) return true;
    
    return !formFields.value.some(field => 
      field.name === name && field.id !== excludeId
    );
  }

  /**
   * Генерирует уникальное имя для поля
   */
  function generateUniqueName(baseName) {
    let name = baseName;
    let counter = 1;
    
    while (!isFieldNameUnique(name)) {
      name = `${baseName}_${counter}`;
      counter++;
    }
    
    return name;
  }

  /**
   * Добавляет новое поле в форму
   */
  function addField(fieldConfig, targetIndex = null) {
    if (!formFields || !formFields.value) return null;
    
    const id = generateFieldId();
    // Генерируем уникальное имя на основе конфига или ID, если имя не задано
    let initialName = fieldConfig.name || `field_${id.split('_')[1]}`;
    const uniqueName = generateUniqueName(initialName);

    const newField = {
      id,
      ...fieldConfig,
      name: uniqueName,
    };
    
    const newFields = [...formFields.value];
    if (targetIndex !== null && targetIndex >= 0) {
      newFields.splice(targetIndex + 1, 0, newField);
    } else {
      newFields.push(newField);
    }
    
    formFields.value = newFields;
    selectField(newField.id);
    return newField;
  }

  /**
   * Обновляет свойства поля
   */
  function updateField(fieldId, updates) {
    if (!formFields || !formFields.value) return;
    
    const index = formFields.value.findIndex(f => f.id === fieldId);
    if (index !== -1) {
      const newFields = [...formFields.value];
      newFields[index] = { ...newFields[index], ...updates };
      formFields.value = newFields;
    }
  }

  /**
   * Добавляет опцию к полю
   */
  function addFieldOption(fieldId) {
    if (!formFields || !formFields.value) return;
    
    const index = formFields.value.findIndex(f => f.id === fieldId);
    if (index !== -1) {
      const field = formFields.value[index];
      const options = field.options ? [...field.options] : [];
      options.push({
        label: 'Новая опция',
        value: `option_${options.length + 1}`,
      });
      
      updateField(fieldId, { options });
    }
  }

  /**
   * Удаляет опцию у поля
   */
  function removeFieldOption(fieldId, optionIndex) {
    if (!formFields || !formFields.value) return;
    
    const index = formFields.value.findIndex(f => f.id === fieldId);
    if (index !== -1) {
      const field = formFields.value[index];
      if (!field.options) return;
      
      const options = [...field.options];
      options.splice(optionIndex, 1);
      
      updateField(fieldId, { options });
    }
  }

  /**
   * Обновляет опцию поля
   */
  function updateFieldOption(fieldId, optionIndex, key, value) {
    if (!formFields || !formFields.value) return;
    
    const index = formFields.value.findIndex(f => f.id === fieldId);
    if (index !== -1) {
      const field = formFields.value[index];
      if (!field.options) return;
      
      const options = [...field.options];
      options[optionIndex] = { ...options[optionIndex], [key]: value };
      
      updateField(fieldId, { options });
    }
  }

  return {
    formFields,
    selectedFieldId,
    fieldErrors, // Экспортируем ошибки
    selectField,
    removeField,
    moveField,
    addField,
    updateField,
    generateFieldId,
    isFieldNameUnique,
    generateUniqueName,
    addFieldOption,
    removeFieldOption,
    updateFieldOption,
    setFieldError, // Экспортируем метод установки ошибки
  };
}
