'use client';

import { CheckIcon, ChevronDownIcon } from 'lucide-react';
import {
  Fragment,
  forwardRef,
  useCallback,
  useEffect,
  useId,
  useState,
} from 'react';

import { Button } from '@/components/ui/button';
import {
  Command,
  CommandEmpty,
  CommandGroup,
  CommandInput,
  CommandItem,
  CommandList,
} from '@/components/ui/command';
import {
  Popover,
  PopoverContent,
  PopoverTrigger,
} from '@/components/ui/popover';
import { RAGFlowSelectOptionType } from '../ui/select';

const countries = [
  {
    label: 'America',
    options: [
      { value: 'United States', label: '🇺🇸' },
      { value: 'Canada', label: '🇨🇦' },
      { value: 'Mexico', label: '🇲🇽' },
    ],
  },
  {
    label: 'Africa',
    options: [
      { value: 'South Africa', label: '🇿🇦' },
      { value: 'Nigeria', label: '🇳🇬' },
      { value: 'Morocco', label: '🇲🇦' },
    ],
  },
  {
    label: 'Asia',
    options: [
      { value: 'China', label: '🇨🇳' },
      { value: 'Japan', label: '🇯🇵' },
      { value: 'India', label: '🇮🇳' },
    ],
  },
  {
    label: 'Europe',
    options: [
      { value: 'United Kingdom', label: '🇬🇧' },
      { value: 'France', label: '🇫🇷' },
      { value: 'Germany', label: '🇩🇪' },
    ],
  },
  {
    label: 'Oceania',
    options: [
      { value: 'Australia', label: '🇦🇺' },
      { value: 'New Zealand', label: '🇳🇿' },
    ],
  },
];

export type SelectWithSearchFlagOptionType = {
  label: string;
  options: RAGFlowSelectOptionType[];
};

export type SelectWithSearchFlagProps = {
  options?: SelectWithSearchFlagOptionType[];
  value?: string;
  onChange?(value: string): void;
};

export const SelectWithSearch = forwardRef<
  React.ElementRef<typeof Button>,
  SelectWithSearchFlagProps
>(({ value: val = '', onChange, options = countries }, ref) => {
  const id = useId();
  const [open, setOpen] = useState<boolean>(false);
  const [value, setValue] = useState<string>('');

  const handleSelect = useCallback(
    (val: string) => {
      setValue(val);
      setOpen(false);
      onChange?.(val);
    },
    [onChange],
  );

  useEffect(() => {
    setValue(val);
  }, [val]);

  return (
    <Popover open={open} onOpenChange={setOpen}>
      <PopoverTrigger asChild>
        <Button
          id={id}
          variant="outline"
          role="combobox"
          aria-expanded={open}
          ref={ref}
          className="bg-background hover:bg-background border-input w-full justify-between px-3 font-normal outline-offset-0 outline-none focus-visible:outline-[3px]"
        >
          {value ? (
            <span className="flex min-w-0 options-center gap-2">
              <span className="text-lg leading-none truncate">
                {
                  options
                    .map((group) =>
                      group.options.find((item) => item.value === value),
                    )
                    .filter(Boolean)[0]?.label
                }
              </span>
            </span>
          ) : (
            <span className="text-muted-foreground">Select value</span>
          )}
          <ChevronDownIcon
            size={16}
            className="text-muted-foreground/80 shrink-0"
            aria-hidden="true"
          />
        </Button>
      </PopoverTrigger>
      <PopoverContent
        className="border-input w-full min-w-[var(--radix-popper-anchor-width)] p-0"
        align="start"
      >
        <Command>
          <CommandInput placeholder="Search ..." />
          <CommandList>
            <CommandEmpty>No data found.</CommandEmpty>
            {options.map((group) => (
              <Fragment key={group.label}>
                <CommandGroup heading={group.label}>
                  {group.options.map((option) => (
                    <CommandItem
                      key={option.value}
                      value={option.value}
                      onSelect={handleSelect}
                    >
                      <span className="text-lg leading-none">
                        {option.label}
                      </span>
                      {option.value}
                      {value === option.value && (
                        <CheckIcon size={16} className="ml-auto" />
                      )}
                    </CommandItem>
                  ))}
                </CommandGroup>
              </Fragment>
            ))}
          </CommandList>
        </Command>
      </PopoverContent>
    </Popover>
  );
});
