import type { ButtonHTMLAttributes, ReactNode } from 'react'
import { cn } from '@/lib/utils'
import { useReadOnly } from '@/lib/useReadOnly'

type Variant = 'primary' | 'secondary' | 'ghost' | 'danger'
type Size = 'sm' | 'md'

interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {
  variant?: Variant
  size?: Size
  /** Кнопка инициирует мутацию данных. В read-only режиме SuperAdmin'а
   * (override без edit-mode) такие кнопки автоматически disabled с tooltip.
   * Нав-кнопки/закрытие модалок/Cancel — оставлять без этого пропа. */
  mutating?: boolean
  children: ReactNode
}

const variants: Record<Variant, string> = {
  primary: 'bg-[var(--color-brand)] hover:bg-[var(--color-brand-hover)] text-white',
  secondary: 'bg-white dark:bg-slate-800 text-slate-700 dark:text-slate-200 border border-slate-200 dark:border-slate-700 hover:bg-slate-50 dark:hover:bg-slate-700',
  ghost: 'text-slate-600 dark:text-slate-300 hover:bg-slate-100 dark:hover:bg-slate-800',
  danger: 'bg-red-600 hover:bg-red-700 text-white',
}

const sizes: Record<Size, string> = {
  sm: 'px-2.5 py-1 text-xs',
  md: 'px-3.5 py-1.5 text-sm',
}

export function Button({ variant = 'primary', size = 'md', mutating, className, children, disabled, title, ...rest }: ButtonProps) {
  const ro = useReadOnly()
  // Variant primary/danger по умолчанию считаем мутирующими (Добавить/
  // Сохранить/Удалить/Создать почти всегда primary либо danger). Secondary/
  // ghost — нав-кнопки и Cancel — не блокируются. Явный mutating={false}
  // нужен только в редких случаях когда primary не делает мутации (например
  // «Применить фильтр», «Войти в режим…»).
  const isMutating = mutating ?? (variant === 'primary' || variant === 'danger')
  const blocked = isMutating && ro.readOnly
  return (
    <button
      {...rest}
      disabled={disabled || blocked}
      title={blocked ? ro.reason : title}
      className={cn(
        'inline-flex items-center gap-1.5 rounded-md font-medium transition-colors disabled:opacity-60 disabled:cursor-not-allowed',
        variants[variant],
        sizes[size],
        className,
      )}
    >
      {children}
    </button>
  )
}
