import type { IntentType, SizeType } from '../const';

export interface DaisyModifierProps {
  outline?: boolean;
  square?: boolean;
  circle?: boolean;
  fill?: boolean;
  bordered?: boolean;
  ghost?: boolean;
  wide?: boolean;
  block?: boolean;
  intent?: IntentType;
  size?: SizeType;
}

export const DaisyModifiers = [
  'outline',
  'square',
  'circle',
  'fill',
  'bordered',
  'ghost',
  'wide',
  'block',
  'intent',
  'size',
] as const;
type DaisyModifierKey = keyof DaisyModifierProps;

export function omitDaisyModifiers<I extends object, K extends DaisyModifierKey>(
  o: I,
  keys: ReadonlyArray<K> = DaisyModifiers as any,
): Omit<I, K> {
  return omit(o, keys as any) as any;
}

export function omit<T extends object, K extends keyof T>(obj: T, keys: K[]) {
  return Object.fromEntries(Object.entries(obj).filter(([k]) => !keys.includes(k as any)));
}

export function daisy(
  name: string,
  { ghost, circle, square, bordered, fill, size, outline, intent }: DaisyModifierProps,
) {
  return [
    name,
    bordered && `${name}-bordered`,
    ghost && `${name}-ghost`,
    circle && `${name}-circle`,
    square && `${name}-square`,
    fill && `${name}-fill`,
    size && `${name}-${size}`,
    outline && `${name}-outline`,
    intent && `${name}-${intent}`,
  ]
    .filter(Boolean)
    .join(' ');
}
