'use client';

import { cn } from '@/utils/Helpers';
import { cva, type VariantProps } from 'class-variance-authority';
import { type ButtonHTMLAttributes, type FC, memo, type PropsWithChildren, type Ref } from 'react';

const buttonVariants = cva(
  'inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50',
  {
    variants: {
      variant: {
        default: 'bg-primary text-primary-foreground shadow hover:bg-primary/90',
        destructive: 'bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90',
        outline: 'border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground',
        secondary: 'bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80',
        ghost: 'hover:bg-accent hover:text-accent-foreground',
        link: 'text-primary underline-offset-4 hover:underline',
      },
      size: {
        default: 'h-9 px-4 py-2',
        sm: 'h-8 rounded-md px-3 text-xs',
        lg: 'h-10 rounded-md px-8',
        icon: 'size-9',
      },
    },
    defaultVariants: {
      variant: 'default',
      size: 'default',
    },
  },
);

export type ButtonProps = {
  className?: string;
  ref?: Ref<HTMLButtonElement> ;
} & PropsWithChildren & ButtonHTMLAttributes<HTMLButtonElement> & VariantProps<typeof buttonVariants> & Omit<ButtonHTMLAttributes<HTMLButtonElement>, 'className'>;

const Button: FC<ButtonProps> = memo(({
  className = '',
  variant,
  size,
  children = null,
  ref,
  ...rest
}) => {
  return (
    <button className={cn(buttonVariants({ variant, size, className }))} type="button" {...rest} ref={ref}>{children}</button>
  );
});

Button.displayName = 'Button';

// eslint-disable-next-line react-refresh/only-export-components
export { Button, buttonVariants };
