/**
 * Demo Module Helpers
 * Contains helper functions for demo modules
 */

/**
 * Generate a unique name for demo module
 * @param baseName - Base name for the module
 * @param existingNames - Array of existing names
 * @returns Unique name
 */
export const generateUniqueName = (
  baseName: string,
  existingNames: string[]
): string => {
  let counter = 1;
  let uniqueName = baseName;
  
  while (existingNames.includes(uniqueName)) {
    uniqueName = `${baseName} ${counter}`;
    counter++;
  }
  
  return uniqueName;
};

/**
 * Calculate similarity between two strings
 * @param str1 - First string
 * @param str2 - Second string
 * @returns Similarity score (0-1)
 */
export const calculateStringSimilarity = (str1: string, str2: string): number => {
  const longer = str1.length > str2.length ? str1 : str2;
  const shorter = str1.length > str2.length ? str2 : str1;
  
  if (longer.length === 0) return 1;
  
  const editDistance = levenshteinDistance(longer, shorter);
  return (longer.length - editDistance) / longer.length;
};

/**
 * Calculate Levenshtein distance between two strings
 * @param str1 - First string
 * @param str2 - Second string
 * @returns Edit distance
 */
const levenshteinDistance = (str1: string, str2: string): number => {
  const matrix = Array(str2.length + 1).fill(null).map(() => Array(str1.length + 1).fill(null));
  
  for (let i = 0; i <= str1.length; i++) matrix[0][i] = i;
  for (let j = 0; j <= str2.length; j++) matrix[j][0] = j;
  
  for (let j = 1; j <= str2.length; j++) {
    for (let i = 1; i <= str1.length; i++) {
      const indicator = str1[i - 1] === str2[j - 1] ? 0 : 1;
      matrix[j][i] = Math.min(
        matrix[j][i - 1] + 1, // deletion
        matrix[j - 1][i] + 1, // insertion
        matrix[j - 1][i - 1] + indicator // substitution
      );
    }
  }
  
  return matrix[str2.length][str1.length];
};
