/**
 * Copyright IBM Corp. 2024, 2025
 */

/**
 * Converts human-readable condition format to filtrex-compatible format
 *
 * @param humanReadable - The human-readable condition string
 * @returns The filtrex-compatible condition string
 *
 * @example
 * Input:  "${requestHeaders.abc} equals 100 and ${response.name} contains ["victor", "sangeeth"]"
 * Output: "${requestHeaders.abc} == 100 and ${response.name} in ("victor", "sangeeth")"
 *
 * @example
 * Input:  "${requestHeaders} containsKey Content-Type and ${response} equals sss"
 * Output: "Content-Type of ${requestHeaders} and ${response} == sss"
 */
export const convertToExecutableFormat = (humanReadable: string): string => {
  if (!humanReadable) return '';

  let executable = humanReadable;

  executable = executable.replace(/ AND /gi, ' and ');
  executable = executable.replace(/ OR /gi, ' or ');
  executable = executable.replace(/\bNOT\b/gi, 'not');

  executable = executable.replace(
    /\$\{([^}]+)\}\s+equalsIgnoreCase\s+([^\s\)]+)/gi,
    '${$1}_lowercase == $2_lowercase',
  );

  executable = executable.replace(
    /\$\{([^}]+)\}\s+notEqualsIgnoreCase\s+([^\s\)]+)/gi,
    '${$1}_lowercase != $2_lowercase',
  );

  executable = executable.replace(
    /\$\{([^}]+)\}\s+contains\s+\[([^\]]+)\]/gi,
    '${$1} in ($2)',
  );

  executable = executable.replace(
    /\$\{([^}]+)\}\s+notContains\s+\[([^\]]+)\]/gi,
    '${$1} not in ($2)',
  );

  executable = executable.replace(
    /\$\{([^}]+)\}\s+exists\b/gi,
    'exists(${$1})',
  );

  executable = executable.replace(
    /\$\{([^}]+)\}\s+notExists\b/gi,
    'not exists(${$1})',
  );

  executable = executable.replace(/\$\{([^}]+)\}\s+empty\b/gi, 'empty(${$1})');

  executable = executable.replace(
    /\$\{([^}]+)\}\s+range\s+\[([^,]+),\s*([^\]]+)\]/gi,
    '(${$1} >= $2 and ${$1} <= $3)',
  );

  executable = executable.replace(
    /\$\{([^}]+)\}\s+containsKey\s+([^\s\)]+)/gi,
    '$2 of ${$1}',
  );
  executable = executable.replace(/\s+greaterThanOrEqual\s+/gi, ' >= ');
  executable = executable.replace(/\s+lessThanOrEqual\s+/gi, ' <= ');
  executable = executable.replace(/\s+notEquals\s+/gi, ' != ');
  executable = executable.replace(/\s+equals\s+/gi, ' == ');
  executable = executable.replace(/\s+greaterThan\s+/gi, ' > ');
  executable = executable.replace(/\s+lessThan\s+/gi, ' < ');

  return executable;
};
