// Component Configuration Types and Validation

export interface VariantConfig {
  className: string;
  [key: string]: any;
}

export interface SizeConfig {
  className: string;
  [key: string]: any;
}

export interface ComponentConfig {
  variants: Record<string, VariantConfig>;
  sizes: Record<string, SizeConfig>;
  defaultVariant?: string;
  defaultSize?: string;
  [key: string]: any;
}

/**
 * Validate component configuration
 * @param config The component configuration to validate
 * @returns Validation result with isValid flag and errors array
 */
export function validateComponentConfig(config: ComponentConfig): { 
  isValid: boolean; 
  errors: string[] 
} {
  const errors: string[] = [];
  
  // Check if variants exist
  if (!config.variants || Object.keys(config.variants).length === 0) {
    errors.push('Component must have at least one variant');
  }
  
  // Check if sizes exist
  if (!config.sizes || Object.keys(config.sizes).length === 0) {
    errors.push('Component must have at least one size');
  }
  
  // Check if default variant exists in variants
  if (config.defaultVariant && !config.variants[config.defaultVariant]) {
    errors.push(`Default variant '${config.defaultVariant}' not found in variants`);
  }
  
  // Check if default size exists in sizes
  if (config.defaultSize && !config.sizes[config.defaultSize]) {
    errors.push(`Default size '${config.defaultSize}' not found in sizes`);
  }
  
  return {
    isValid: errors.length === 0,
    errors
  };
}

/**
 * Create a component configuration
 * @param config The component configuration
 * @returns The validated component configuration
 */
export function createComponentConfig(config: ComponentConfig): ComponentConfig {
  const validation = validateComponentConfig(config);
  
  if (!validation.isValid) {
    throw new Error(`Invalid component configuration: ${validation.errors.join(', ')}`);
  }
  
  return config;
}
