import { mergeProps } from "@base-ui/react/merge-props";
import { useRender } from "@base-ui/react/use-render";
import { cva } from "class-variance-authority";
import { cn } from "@/lib/utils";

const badgeVariants = cva(
  "ino:group/badge ino:inline-flex ino:h-5 ino:w-fit ino:shrink-0 ino:items-center ino:justify-center ino:gap-1 ino:overflow-hidden ino:rounded-4xl ino:border ino:border-transparent ino:px-2 ino:py-0.5 ino:text-xs ino:font-medium ino:whitespace-nowrap ino:transition-all ino:focus-visible:border-ring ino:focus-visible:ring-[3px] ino:focus-visible:ring-ring/50 ino:has-data-[icon=inline-end]:pr-1.5 ino:has-data-[icon=inline-start]:pl-1.5 ino:aria-invalid:border-destructive ino:aria-invalid:ring-destructive/20 ino:dark:aria-invalid:ring-destructive/40 ino:[&>svg]:pointer-events-none ino:[&>svg]:size-3!",
  {
    variants: {
      variant: {
        default:
          "ino:bg-primary ino:text-primary-foreground ino:[a]:hover:bg-primary/80",
        secondary:
          "ino:bg-secondary ino:text-secondary-foreground ino:[a]:hover:bg-secondary/80",
        destructive:
          "ino:bg-destructive/10 ino:text-destructive ino:focus-visible:ring-destructive/20 ino:dark:bg-destructive/20 ino:dark:focus-visible:ring-destructive/40 ino:[a]:hover:bg-destructive/20",
        outline:
          "ino:border-border ino:text-foreground ino:[a]:hover:bg-muted ino:[a]:hover:text-muted-foreground",
        ghost:
          "ino:hover:bg-muted ino:hover:text-muted-foreground ino:dark:hover:bg-muted/50",
        link: "ino:text-primary ino:underline-offset-4 ino:hover:underline",
      },
    },
    defaultVariants: {
      variant: "default",
    },
  },
);

function Badge({ className, variant = "default", render, ...props }) {
  return useRender({
    defaultTagName: "span",
    props: mergeProps(
      {
        className: cn(badgeVariants({ variant }), className),
      },
      props,
    ),
    render,
    state: {
      slot: "badge",
      variant,
    },
  });
}

export { Badge, badgeVariants };
