import * as React from 'react'
import * as RTabs from '@radix-ui/react-tabs'
import { Badge } from './Badge'
import { cn } from './cva'

export const Tabs = RTabs.Root

export const TabsList = React.forwardRef<
  React.ElementRef<typeof RTabs.List>,
  React.ComponentPropsWithoutRef<typeof RTabs.List>
>(({ className, ...props }, ref) => (
  <RTabs.List
    ref={ref}
    className={cn('inline-flex items-center gap-2 rounded-lg bg-[var(--mod-color-neutral-3)] p-1', className)}
    {...props}
  />
))
TabsList.displayName = 'TabsList'

export const TabsTrigger = React.forwardRef<
  React.ElementRef<typeof RTabs.Trigger>,
  React.ComponentPropsWithoutRef<typeof RTabs.Trigger>
>(({ className, ...props }, ref) => (
  <RTabs.Trigger
    ref={ref}
    className={cn(
      'inline-flex min-h-[var(--mod-touch-min)] items-center gap-2 rounded-md px-3 text-[var(--mod-color-accent-11)] data-[state=inactive]:bg-[var(--mod-color-accent-3)] data-[state=inactive]:hover:bg-[var(--mod-color-accent-4)] data-[state=inactive]:active:bg-[var(--mod-color-accent-5)] data-[state=active]:bg-[var(--mod-color-accent-9)] data-[state=active]:text-[var(--mod-color-accent-contrast)] focus-visible:outline-[var(--mod-focus-ring-width)] focus-visible:outline-[var(--mod-focus-ring-color)] focus-visible:outline-offset-[var(--mod-focus-ring-offset)] disabled:cursor-not-allowed disabled:opacity-[var(--mod-opacity-disabled)]',
      className,
    )}
    {...props}
  />
))
TabsTrigger.displayName = 'TabsTrigger'

export const TabsContent = React.forwardRef<
  React.ElementRef<typeof RTabs.Content>,
  React.ComponentPropsWithoutRef<typeof RTabs.Content>
>(({ className, ...props }, ref) => (
  <RTabs.Content
    ref={ref}
    className={cn('focus-visible:outline-[var(--mod-focus-ring-width)] focus-visible:outline-[var(--mod-focus-ring-color)] focus-visible:outline-offset-[var(--mod-focus-ring-offset)]', className)}
    {...props}
  />
))
TabsContent.displayName = 'TabsContent'

export function tabBadgeTone(
  count: number,
  warnAt: number,
  dangerAt: number,
): 'neutral' | 'warning' | 'danger' {
  if (count >= dangerAt) return 'danger'
  if (count >= warnAt) return 'warning'
  return 'neutral'
}

export interface TabsTriggerWithBadgeProps
  extends React.ComponentPropsWithoutRef<typeof RTabs.Trigger> {
  count?: number
  warnAt?: number
  dangerAt?: number
}

export const TabsTriggerWithBadge = React.forwardRef<
  React.ElementRef<typeof RTabs.Trigger>,
  TabsTriggerWithBadgeProps
>(({ count, warnAt, dangerAt, children, className, ...props }, ref) => (
  <TabsTrigger
    ref={ref}
    className={cn('justify-center', className)}
    {...props}
  >
    {children}
    {count != null && count > 0 ? (
      <Badge tone={tabBadgeTone(count, warnAt ?? Infinity, dangerAt ?? Infinity)}>
        {count}
      </Badge>
    ) : null}
  </TabsTrigger>
))
TabsTriggerWithBadge.displayName = 'TabsTriggerWithBadge'
