import { AUTOMATION_VARIABLES } from './catalog';

const TOKEN_PATTERN = /\{\{\s*([^{}\s]+)\s*\}\}/g;
const VALID_TOKENS = new Set(
  AUTOMATION_VARIABLES.map((variable) =>
    variable.token.replace(/^\{\{|\}\}$/g, ''),
  ),
);

export function resolveVariables(
  text: string,
  ctx: Record<string, unknown>,
): { text: string; unresolved: string[] } {
  const unresolved = new Set<string>();

  const resolvedText = text.replace(TOKEN_PATTERN, (match, token: string) => {
    if (!VALID_TOKENS.has(token)) {
      unresolved.add(token);
      return match;
    }

    const value = ctx[token];
    if (value === null || value === undefined || value === '') {
      unresolved.add(token);
      return match;
    }

    return stringifyVariableValue(value);
  });

  return {
    text: resolvedText,
    unresolved: Array.from(unresolved),
  };
}

function stringifyVariableValue(value: unknown): string {
  if (typeof value === 'string') return value;
  if (
    typeof value === 'number' ||
    typeof value === 'boolean' ||
    typeof value === 'bigint'
  ) {
    return String(value);
  }
  if (value instanceof Date) return value.toISOString();

  return JSON.stringify(value) ?? '';
}
