import { useState } from 'react';
import { type ControllerProps } from 'react-hook-form';

import { type FilterOptionsState } from '@material-hu/mui/useAutocomplete';

import {
  DEFAULT_USERS_SEARCH_PARAMS,
  useUserPotentialBossesSearch,
  useUsersPublicSearch,
} from 'src/services/usersQueries';
import { type DefaultEmptyAutoCompleteOptions } from 'src/types/form';
import { type User } from 'src/types/user';
import { getFullname } from 'src/utils/userUtils';

import AutocompleteUserItem from 'src/components/AutocompleteUserItem';
import FormAutocomplete, {
  type Props as FormAutoCompleteProps,
} from 'src/components/FormInputs/FormAutocomplete';

type Props = {
  potentialBossesId?: number;
  rules?: ControllerProps['rules'];
  defaultSearchOptions?: DefaultEmptyAutoCompleteOptions | undefined;
  filterOptions?: (options: User[], state: FilterOptionsState<User>) => User[];
  isAgent?: boolean;
} & FormAutoCompleteProps;

function UsersAutocomplete({
  potentialBossesId,
  rules,
  defaultSearchOptions = undefined,
  filterOptions,
  isAgent,
  ...rest
}: Props) {
  const [search, setSearch] = useState('');
  const bossesSearchResult = useUserPotentialBossesSearch(
    { userId: potentialBossesId ?? null, search },
    { enabled: !!potentialBossesId && !!search },
  );
  const publicSearchResult = useUsersPublicSearch({
    params: {
      search,
      isAgent,
      limit:
        defaultSearchOptions?.defaultLimit || DEFAULT_USERS_SEARCH_PARAMS.limit,
    },
    extraUseQueryParams: {
      enabled:
        (potentialBossesId === undefined && !!search) ||
        !!defaultSearchOptions?.enableEmptyQuery,
    },
  });

  const { data, isLoading } = potentialBossesId
    ? bossesSearchResult
    : publicSearchResult;

  return (
    <FormAutocomplete
      rules={rules}
      {...rest}
      autocompleteProps={{
        limitTags: 2,
        getOptionLabel: (user: User) => getFullname(user),
        isOptionEqualToValue: (option: User, value: User) =>
          option.id === value.id,
        renderOption: AutocompleteUserItem(
          rest?.autocompleteProps?.multiple ?? false,
        ),
        onInputChange: (_, value) => setSearch(value),
        options: data?.data.items || [],
        loading: isLoading,
        filterOptions: filterOptions || (options => options),
        ...rest?.autocompleteProps,
      }}
    />
  );
}
export default UsersAutocomplete;
