import * as React from 'react'

import {cva, type VariantProps} from 'class-variance-authority'
import {Slot as SlotPrimitive} from 'radix-ui'

import {cn} from '../../lib/utils'

/**
 * A component for displaying status, categories, or labels with multiple visual variants.
 * @publicDocs
 */
export interface BadgeDocProps {
  /** Visual style variant */
  variant?: 'primary' | 'secondary' | 'destructive' | 'outline' | 'none'
  /** Render as child element instead of span */
  asChild?: boolean
  /** Content to render inside */
  children?: React.ReactNode
}

const badgeVariants = cva(
  'inline-flex items-center justify-center rounded-md border px-2 py-0.5 text-xs font-medium w-fit whitespace-nowrap shrink-0 [&>svg]:size-3 gap-1 [&>svg]:pointer-events-none transition-[color,box-shadow] overflow-hidden',
  {
    variants: {
      variant: {
        primary: 'border-transparent bg-primary text-primary-foreground',
        secondary: 'border-transparent bg-secondary text-secondary-foreground',
        destructive:
          'border-transparent bg-destructive text-white dark:bg-destructive/60',
        outline: 'bg-white text-foreground',
        none: '', // Allows custom classes
      },
    },
    defaultVariants: {
      variant: 'primary',
    },
  }
)

function Badge({
  className,
  variant,
  asChild = false,
  ...props
}: React.ComponentProps<'span'> &
  VariantProps<typeof badgeVariants> & {asChild?: boolean}) {
  const Comp = asChild ? SlotPrimitive.Slot : 'span'

  return (
    <Comp
      data-slot="badge"
      className={cn(badgeVariants({variant}), className)}
      {...props}
    />
  )
}

export {Badge, badgeVariants}
