/**
 * Convert any string to CamelCase format
 */
export function toCamelCase(str: string): string {
  return str.toLowerCase().replace(/[^a-zA-Z0-9]+(.)/g, (_, chr) => chr.toUpperCase());
}

/**
 * Convert any string to SnakeCase format
 */
export function toSnakeCase(str: string): string {
  return str
    .replace(/([a-z])([A-Z])/g, '$1_$2') // Add underline between lowercase and uppercase letters
    .toLowerCase() // Convert to lowercase
    .replace(/[^a-z0-9]+/g, '_'); // Replace non-alphanumeric characters with underscores
}

/**
 * Convert any string to PascalCase format (first letter capitalized)
 */
export function toPascalCase(str: string): string {
  return str
    .replace(/([a-z])([A-Z])/g, '$1 $2') // Add space between lowercase and uppercase letters
    .replace(/[^a-zA-Z0-9]+/g, ' ') // Replace non-alphanumeric characters with spaces
    .split(' ') // Separate strings by spaces
    .map(word => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase()) // The first letter is capitalized, the rest are lowercase
    .join(''); // Combine into a string
}

/**
 * Convert CamelCase or SnakeCase string to string format with specified separator
 */
export function toSeparatedCase(str: string, separator: string = '_'): string {
  return str
    .replace(/([a-z0-9])([A-Z])/g, '$1' + separator + '$2')
    .replace(/[_\s]+/g, separator)
    .toLowerCase();
}

/**
 * Convert the string to all uppercase and delimit it using the specified delimiter
 */
export function toUpperSeparatedCase(str: string, separator: string = '_'): string {
  return str
    .toUpperCase() // Convert all letters to uppercase
    .replace(/([a-z0-9])([A-Z])/g, '$1' + separator + '$2') // Add separator between lowercase letters and uppercase letters
    .replace(/[^A-Z0-9]+/g, separator) // Replace non-alphanumeric characters with separators
    .replace(new RegExp(`^${separator}|${separator}$`, 'g'), ''); // Remove the starting and ending separators
}
