export namespace Daisy {
  type SemanticColorType = 'info' | 'success' | 'warning' | 'error';
  type ThemeColorType = 'primary' | 'secondary' | 'accent';
  type StatusModifierType = 'active' | 'disabled' | 'readonly' | 'loading' | 'open';
  type AlignType = 'start' | 'center' | 'end';
  type PositionType = 'top' | 'right' | 'bottom' | 'left';

  const Sizes: Record<
    SizeType,
    {
      [key in ComponentType | 'size' | 'loading' | 'icon']: string;
    } & {
      [key in 'value']: number;
    }
  > = {
    xs: {
      btn: 'btn-xs',
      loading: 'loading-xs',
      input: 'input-xs',
      textarea: 'textarea-xs',
      size: 'size-6',
      checkbox: 'checkbox-xs',
      tabs: 'tabs-xs',
      icon: 'size-4',
      select: 'select-xs',
      badge: 'badge-xs',
      kbd: 'kbd-xs',
      table: 'table-xs',
      'btm-nav': 'btm-nav-xs',
      menu: 'menu-xs',
      'file-input': 'file-input-xs',
      value: 24,
    },
    sm: {
      btn: 'btn-sm',
      loading: 'loading-sm',
      input: 'input-sm',
      textarea: 'textarea-sm',
      checkbox: 'checkbox-sm',
      size: 'size-8',
      tabs: 'tabs-sm',
      icon: 'size-5',
      select: 'select-sm',
      badge: 'badge-sm',
      kbd: 'kbd-sm',
      table: 'table-sm',
      'btm-nav': 'btm-nav-sm',
      menu: 'menu-sm',
      'file-input': 'file-input-sm',
      value: 32,
    },
    md: {
      btn: 'btn-md',
      loading: 'loading',
      input: 'input-md',
      textarea: 'textarea-md',
      checkbox: 'checkbox-md',
      size: 'size-12',
      tabs: 'tabs-md',
      icon: 'size-8',
      select: 'select-md',
      badge: 'badge-md',
      kbd: 'kbd-md',
      table: 'table-md',
      'btm-nav': 'btm-nav-md',
      menu: 'menu-md',
      'file-input': 'file-input-md',
      value: 48,
    },
    lg: {
      btn: 'btn-lg',
      loading: 'loading-lg',
      input: 'input-lg',
      textarea: 'textarea-lg',
      checkbox: 'checkbox-lg',
      size: 'size-16',
      tabs: 'tabs-lg',
      icon: 'size-12',
      badge: 'badge-lg',
      select: 'select-lg',
      kbd: 'kbd-lg',
      table: 'table-lg',
      'btm-nav': 'btm-nav-lg',
      menu: 'menu-lg',
      'file-input': 'file-input-lg',
      value: 64,
    },
  };

  export type SizeType = 'xs' | 'sm' | 'md' | 'lg';

  type ComponentType =
    | 'btn'
    | 'input'
    | 'textarea'
    | 'checkbox'
    | 'tabs'
    | 'select'
    | 'badge'
    | 'kbd'
    | 'table'
    | 'btm-nav'
    | 'menu'
    | 'file-input';

  // radio range rating toggle

  export function getSize(size?: SizeType) {
    return size ? Sizes[size] : undefined;
  }

  function sizeOf(type: ComponentType, size: SizeType = 'md') {
    return size ? Sizes[size][type] : undefined;
  }
}

type ComponentDef = {
  name: string;
  size?: boolean;
  semanticColor?: boolean;
  themeColor?: boolean;
  modifiers?: string[];
};

const Components: ComponentDef[] = [
  {
    name: 'button',
    size: true,
    semanticColor: true,
    themeColor: true,
  },
];
