import { forwardRef, type ButtonHTMLAttributes, type ReactNode } from 'react';
import { buttonVariants, type ButtonVariant, type ButtonSize } from '@lib/theme/variants';
import { cn } from '@lib/utils/cn';

export interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {
  variant?: ButtonVariant;
  size?: ButtonSize;
  icon?: ReactNode;
  trailingIcon?: ReactNode;
}

/**
 * Button — 프로젝트 표준 버튼
 * variant: primary / secondary / ghost / outline / destructive
 * size: sm / md / lg
 * className override는 cn()으로 안전하게 허용됨.
 *
 * **접근성 정책**:
 * - 텍스트 children이 있는 버튼: 그 텍스트가 접근 이름
 * - 아이콘 전용 버튼 (children 없이 icon만): 반드시 aria-label 또는 title 필수
 *   예) <Button variant="ghost" aria-label="닫기" icon={<X/>} />
 * - 위반 시 스크린 리더가 용도를 인지할 수 없어 WCAG 2.1 Level A 위반
 */
export const Button = forwardRef<HTMLButtonElement, ButtonProps>(
  ({ className, variant, size, icon, trailingIcon, children, ...props }, ref) => {
    return (
      <button ref={ref} className={cn(buttonVariants({ variant, size }), className)} {...props}>
        {icon}
        {children}
        {trailingIcon}
      </button>
    );
  },
);
Button.displayName = 'Button';
