import { mergeProps } from "@base-ui/react/merge-props"
import { useRender } from "@base-ui/react/use-render"
import { cva, type VariantProps } from "class-variance-authority"

import { cn } from "@/lib/utils"

const badgeVariants = cva(
  "group/badge inline-flex h-[28px] w-fit shrink-0 items-center justify-center gap-1 overflow-hidden rounded-[20px] border border-transparent pt-1 pb-1 pe-3 ps-3 text-[13px] leading-[13px] font-normal tracking-normal whitespace-nowrap transition-all focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 has-data-[icon=inline-end]:pe-1.5 has-data-[icon=inline-start]:ps-1.5 aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 [&>svg]:pointer-events-none [&>svg]:size-3!",
  {
    variants: {
      variant: {
        default:
          "bg-[var(--badge-color-confirm-bg)] text-[var(--badge-color-confirm-text)] [a]:hover:bg-[var(--badge-color-confirm-bg)]/90",
        confirm:
          "bg-[var(--badge-color-confirm-bg)] text-[var(--badge-color-confirm-text)]",
        "under-review":
          "bg-[var(--badge-color-under-review-bg)] text-[var(--badge-color-under-review-text)]",
        "on-the-way":
          "bg-[var(--badge-color-on-the-way-bg)] text-[var(--badge-color-on-the-way-text)]",
        "service-started":
          "bg-[var(--badge-color-service-started-bg)] text-[var(--badge-color-service-started-text)]",
        complete:
          "bg-[var(--badge-color-complete-bg)] text-[var(--badge-color-complete-text)]",
        cancel:
          "bg-[var(--badge-color-cancel-bg)] text-[var(--badge-color-cancel-text)]",
        "under-dispute":
          "bg-[var(--badge-color-under-dispute-bg)] text-[var(--badge-color-under-dispute-text)]",
        closed:
          "bg-[var(--badge-color-closed-bg)] text-[var(--badge-color-closed-text)]",
        secondary:
          "bg-secondary text-secondary-foreground [a]:hover:bg-secondary/80",
        destructive:
          "bg-destructive/10 text-destructive focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:focus-visible:ring-destructive/40 [a]:hover:bg-destructive/20",
        outline:
          "border-border text-foreground [a]:hover:bg-muted [a]:hover:text-muted-foreground",
        ghost:
          "hover:bg-muted hover:text-muted-foreground dark:hover:bg-muted/50",
        link: "text-primary underline-offset-4 hover:underline",
      },
    },
    defaultVariants: {
      variant: "default",
    },
  }
)

function Badge({
  className,
  variant = "default",
  render,
  ...props
}: useRender.ComponentProps<"span"> & VariantProps<typeof badgeVariants>) {
  return useRender({
    defaultTagName: "span",
    props: mergeProps<"span">(
      {
        className: cn(badgeVariants({ variant }), className),
      },
      props
    ),
    render,
    state: {
      slot: "badge",
      variant,
    },
  })
}

export { Badge, badgeVariants }
