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

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

  if (operation === 'create') {
    const data = {
      name: this.getNodeParameter('name', i) as string,
      website: this.getNodeParameter('website', i) as string,
      industry: this.getNodeParameter('industry', i) as string,
      description: this.getNodeParameter('description', i) as string,
      ...this.getNodeParameter('additionalFields', i, {}) as IDataObject,
    };

    return GHLEngine.createCompany(data);
  }

  if (operation === 'update') {
    const companyId = this.getNodeParameter('companyId', i) as string;
    const data = {
      name: this.getNodeParameter('name', i) as string,
      website: this.getNodeParameter('website', i) as string,
      industry: this.getNodeParameter('industry', i) as string,
      description: this.getNodeParameter('description', i) as string,
      ...this.getNodeParameter('additionalFields', i, {}) as IDataObject,
    };

    return GHLEngine.updateCompany(companyId, data);
  }

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

  if (operation === 'getAll') {
    const returnAll = this.getNodeParameter('returnAll', i) as boolean;
    const filters = this.getNodeParameter('filters', i) as IDataObject;

    if (returnAll) {
      return GHLEngine.getCompanies({ params: filters });
    } else {
      const limit = this.getNodeParameter('limit', i) as number;
      return GHLEngine.getCompanies({ params: { ...filters, limit } });
    }
  }

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

  if (operation === 'addTag') {
    const companyId = this.getNodeParameter('companyId', i) as string;
    const tags = (this.getNodeParameter('tags', i) as string).split(',').map(tag => tag.trim());
    return GHLEngine.addTagsToCompany(companyId, tags);
  }

  if (operation === 'removeTag') {
    const companyId = this.getNodeParameter('companyId', i) as string;
    const tags = (this.getNodeParameter('tags', i) as string).split(',').map(tag => tag.trim());
    return GHLEngine.removeTagsFromCompany(companyId, tags);
  }

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