/**
 * Generate axis className with optional prefix
 * @param baseClassName Base className (e.g., 'axis-line')
 * @param suffix Suffix (e.g., 'line')
 * @param classNamePrefix User-defined prefix (e.g., 'g2-')
 * @returns Concatenated className
 *
 * @example
 * getAxisClassName('axis-line', 'line', 'g2-')
 * // => 'axis-line g2-axis-line'
 *
 * getAxisClassName('axis-line', 'line', undefined)
 * // => 'axis-line'
 */
export function getAxisClassName(baseClassName: string, suffix: string, classNamePrefix?: string): string {
  if (!classNamePrefix) return baseClassName;
  return `${baseClassName} ${classNamePrefix}axis-${suffix}`;
}

/**
 * Extract className from component attributes
 * @param attributes Component attributes
 * @param baseClassName Base className object
 * @param suffix Suffix string
 * @returns Concatenated className
 */
export function getClassNameFromAttrs(
  attributes: { classNamePrefix?: string },
  baseClassName: { name: string },
  suffix: string
): string {
  const { classNamePrefix = '' } = attributes;
  return getAxisClassName(baseClassName.name, suffix, classNamePrefix);
}

/**
 * Apply full className (with prefix) to a selection element
 * This is a helper to implement the two-step pattern:
 * 1. Create element with base className
 * 2. Apply full className with prefix
 *
 * @param selection The selection to apply className to
 * @param baseClassName Base className object from CLASS_NAMES
 * @param suffix Suffix from CLASSNAME_SUFFIX_MAP
 * @param classNamePrefix Optional user-defined prefix
 * @returns The selection for chaining
 *
 * @example
 * const element = container.maybeAppendByClassName(CLASS_NAMES.grid, 'g');
 * applyClassName(element, CLASS_NAMES.grid, CLASSNAME_SUFFIX_MAP.grid, classNamePrefix);
 */
export function applyClassName(
  selection: any,
  baseClassName: { name: string },
  suffix: string,
  classNamePrefix?: string
): any {
  if (classNamePrefix) {
    selection.attr('className', getAxisClassName(baseClassName.name, suffix, classNamePrefix));
  }
  return selection;
}
