import Link from "next/link";
import { forwardRef } from "react";
import { cn } from "@/lib/utils";

type ButtonVariant = "primary" | "secondary" | "ghost";

const variants: Record<ButtonVariant, string> = {
  primary:
    "bg-[var(--brand-primary)] text-[var(--brand-contrast)] shadow-[0_18px_40px_rgba(63,165,232,0.35)] hover:bg-[#4bc4ff] focus-visible:outline-[var(--brand-primary)]",
  secondary:
    "bg-white/10 text-[var(--brand-contrast)] ring-1 ring-inset ring-[var(--brand-primary)]/40 backdrop-blur hover:bg-white/15 focus-visible:outline-[var(--brand-primary)]/70",
  ghost:
    "bg-[var(--brand-contrast)] text-[var(--brand-navy)] hover:bg-[#e9f3ff] ring-1 ring-inset ring-[var(--brand-primary)]/40 focus-visible:outline-[var(--brand-primary)]/60",
};

type AnchorProps = Omit<React.AnchorHTMLAttributes<HTMLAnchorElement>, "href"> & {
  href: string;
};

type NativeButtonProps = React.ButtonHTMLAttributes<HTMLButtonElement> & {
  href?: undefined;
};

type ButtonProps = (AnchorProps | NativeButtonProps) & {
  variant?: ButtonVariant;
  fullWidth?: boolean;
};

export const Button = forwardRef<HTMLAnchorElement | HTMLButtonElement, ButtonProps>(
  function Button({ className, variant = "primary", fullWidth, href, ...props }, ref) {
    const sharedClassName = cn(
      "inline-flex items-center justify-center rounded-full px-6 py-3 text-sm font-medium transition focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 disabled:cursor-not-allowed disabled:opacity-70",
      variants[variant],
      fullWidth && "w-full",
      className,
    );

    if (href) {
      const { href: _ignored, ...anchorProps } = props as AnchorProps;
      void _ignored;
      return (
        <Link
          ref={ref as React.Ref<HTMLAnchorElement>}
          href={href}
          className={sharedClassName}
          {...anchorProps}
        />
      );
    }

    const { type, ...buttonProps } = props as NativeButtonProps;
    return (
      <button
        ref={ref as React.Ref<HTMLButtonElement>}
        className={sharedClassName}
        type={type ?? "button"}
        {...buttonProps}
      />
    );
  },
);
