"use client";

import { Search } from "lucide-react";
import { useId } from "react";

// The icon-in-a-box search field used by the employee list, the audit log and
// the org chart. Each was a hand-rolled copy whose <input> carried only a
// placeholder — no label at all — and killed its own focus ring with
// outline-none. A placeholder is not a label: it disappears on the first
// keystroke and is not reliably announced.
export function SearchInput({
  value,
  onChange,
  placeholder,
  label,
  className = "",
}: {
  value: string;
  onChange: (value: string) => void;
  placeholder: string;
  /** Visually hidden; this is what a screen reader announces. */
  label: string;
  className?: string;
}) {
  const id = useId();
  return (
    <div
      className={`flex min-w-[240px] flex-1 items-center gap-2 rounded border border-border bg-white px-3 py-2 focus-within:outline-2 focus-within:outline-offset-1 focus-within:outline-brand-500 ${className}`}
    >
      <Search className="h-4 w-4 shrink-0 text-ink-muted" aria-hidden />
      <label htmlFor={id} className="sr-only">
        {label}
      </label>
      <input
        id={id}
        type="search"
        value={value}
        onChange={(e) => onChange(e.target.value)}
        placeholder={placeholder}
        // The ring lives on the wrapper so it encloses the icon too.
        className="w-full text-sm text-ink outline-none placeholder:text-ink-muted"
      />
    </div>
  );
}
