import * as React from "react";
import { ChevronDown } from "@/components/ui/icons";
import { cn } from "@/lib/utils";

type Size = "sm" | "md" | "lg";

// On retire `size` du HTMLSelectElement (number natif pour combobox/listbox)
// pour reutiliser le nom au sens design system.
type Props = Omit<React.SelectHTMLAttributes<HTMLSelectElement>, "size"> & {
  invalid?: boolean;
  /** Alignement de spec avec Button/Input : sm 36px, md 40px, lg 44px (44 garanti mobile). */
  size?: Size;
};

const sizeClasses: Record<Size, string> = {
  sm: "min-h-11 md:min-h-9 h-11 md:h-9 pl-3 pr-8 text-xs",
  md: "min-h-11 md:min-h-10 h-11 md:h-10 pl-3 pr-9 py-2.5 text-sm",
  lg: "min-h-11 h-11 pl-3.5 pr-9 text-sm",
};

export const Select = React.forwardRef<HTMLSelectElement, Props>(
  ({ className, invalid, size = "md", children, ...props }, ref) => {
    return (
      // Wrapper avec focus-within pour rendre le focus ring visible y compris
      // sur iOS Safari ou les select natifs gomment partiellement input-ring.
      // Use end-* (logical) plutot que right-* pour preparer un eventuel RTL.
      <div className="relative focus-within:ring-2 focus-within:ring-accent/55 focus-within:ring-offset-2 focus-within:ring-offset-background rounded-md transition-shadow duration-150">
        <select
          ref={ref}
          aria-invalid={invalid || undefined}
          className={cn(
            "input-ring w-full appearance-none bg-surface border border-border rounded-md text-text transition-[border-color,box-shadow,background-color] duration-150 ease-[cubic-bezier(0.23,1,0.32,1)]",
            sizeClasses[size],
            "disabled:opacity-50 disabled:cursor-not-allowed",
            invalid && "border-danger/60",
            className,
          )}
          {...props}
        >
          {children}
        </select>
        <ChevronDown
          aria-hidden
          className="pointer-events-none absolute end-3 top-1/2 -translate-y-1/2 size-4 text-text-dim"
        />
      </div>
    );
  },
);
Select.displayName = "Select";
