import { ButtonHTMLAttributes, forwardRef } from 'react';
import { cn } from '../../lib/utils';
import { ButtonSpinner } from './spinner';

export interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {
    variant?: 'primary' | 'secondary' | 'outline' | 'ghost' | 'danger';
    size?: 'sm' | 'md' | 'lg';
    isLoading?: boolean;
    fullWidth?: boolean;
}

const Button = forwardRef<HTMLButtonElement, ButtonProps>(
    (
        {
            className,
            variant = 'primary',
            size = 'md',
            isLoading = false,
            fullWidth = false,
            children,
            disabled,
            ...props
        },
        ref
    ) => {
        const baseStyles =
            'inline-flex items-center justify-center rounded-lg font-semibold transition-all focus:outline-none focus:ring-2 focus:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed';

        const variants = {
            primary:
                'bg-brand text-white hover:bg-brand/90 focus:ring-brand/50 shadow-sm hover:shadow-md active:scale-[0.98]',
            secondary:
                'bg-slate-100 text-slate-900 hover:bg-slate-200 focus:ring-slate-500/50 active:scale-[0.98]',
            outline:
                'border-2 border-brand text-brand hover:bg-brand/10 focus:ring-brand/50 active:scale-[0.98]',
            ghost:
                'text-slate-700 hover:bg-slate-100 focus:ring-slate-500/50',
            danger:
                'bg-rose-600 text-white hover:bg-rose-700 focus:ring-rose-500/50 shadow-sm hover:shadow-md active:scale-[0.98]',
        };

        const sizes = {
            sm: 'px-3 py-1.5 text-sm',
            md: 'px-4 py-2 text-sm',
            lg: 'px-6 py-3 text-base',
        };

        return (
            <button
                ref={ref}
                disabled={disabled || isLoading}
                className={cn(
                    baseStyles,
                    variants[variant],
                    sizes[size],
                    fullWidth && 'w-full',
                    className
                )}
                {...props}
            >
                {isLoading && <ButtonSpinner />}
                {children}
            </button>
        );
    }
);

Button.displayName = 'Button';

export { Button };
