import { IExecuteFunctions, IDataObject } from 'n8n-workflow';
import { ICustomField } from './customField.types';
import { GoHighLevelManager } from '@src/utils/gohighlevel';

export async function handleCustomFieldOperations(
  this: IExecuteFunctions,
  operation: string,
  i: number,
): Promise<IDataObject | IDataObject[]> {
  const GHLEngine = await GoHighLevelManager.getInstance(this);

  if (operation === 'create') {
    const model = this.getNodeParameter('model', i) as ICustomField['model'];
    const data: ICustomField = {
      name: this.getNodeParameter('name', i) as string,
      dataType: this.getNodeParameter('dataType', i) as ICustomField['dataType'],
      model,
      ...this.getNodeParameter('additionalFields', i, {}) as IDataObject,
    };

    if (data.dataType === 'SELECT') {
      const options = (this.getNodeParameter('options', i) as string).split(',').map(opt => opt.trim());
      data.options = options;
    }

    const defaultValue = this.getNodeParameter('defaultValue', i) as string;
    if (defaultValue) {
      data.defaultValue = defaultValue;
    }

    return GHLEngine.createCustomField(model, data);
  }

  if (operation === 'update') {
    const customFieldId = this.getNodeParameter('customFieldId', i) as string;
    const data = {
      ...this.getNodeParameter('additionalFields', i, {}) as IDataObject,
    };

    if (data.type === 'select') {
      const options = (this.getNodeParameter('options', i) as string).split(',').map(opt => opt.trim());
      data.options = options;
    }

    return GHLEngine.updateCustomField(customFieldId, data);
  }

  if (operation === 'get') {
    const customFieldId = this.getNodeParameter('customFieldId', i) as string;
    return GHLEngine.getCustomField(customFieldId);
  }

  if (operation === 'getAll') {
    return GHLEngine.getCustomFields();
  }

  if (operation === 'delete') {
    const customFieldId = this.getNodeParameter('customFieldId', i) as string;
    return GHLEngine.deleteCustomField(customFieldId);
  }

  throw new Error(`Unknown operation: ${operation}`);
}
