import { ref, Ref, SetupContext } from 'vue';
import {
  HandleSearch,
  RecentlyFocus,
  InputDebounceCb,
  TransInputFocusEmit,
  SourceType,
  UseInputHandle,
} from '../auto-complete-types';
export default function useInputHandle(
  ctx: SetupContext,
  searchList: Ref<SourceType>,
  showNoResultItemTemplate: Ref<boolean>,
  modelValue: Ref<string>,
  isDisabled: Ref<boolean>,
  delay: Ref<number>,
  handleSearch: HandleSearch,
  transInputFocusEmit: Ref<TransInputFocusEmit>,
  recentlyFocus: RecentlyFocus,
  latestSource: Ref
): UseInputHandle {
  const visible = ref(false);
  const inputRef = ref();
  const searchStatus = ref(false);
  const isFocus = ref(false);
  const debounce = (cb: InputDebounceCb, time: number) => {
    let timer: NodeJS.Timeout | null;
    return (arg: string) => {
      if (timer) {
        clearTimeout(timer);
      }
      timer = setTimeout(async () => {
        searchStatus.value = true;
        await cb(arg);
        searchStatus.value = false;
      }, time);
    };
  };
  const onInputCb = async (value: string) => {
    await handleSearch(value);
    visible.value = true;
  };
  const onInputDebounce = debounce(onInputCb, delay.value);
  const onInput = (e: Event) => {
    const inp = e.target as HTMLInputElement;
    searchStatus.value = false;
    showNoResultItemTemplate.value = false;
    ctx.emit('update:modelValue', inp.value);
    onInputDebounce(inp.value);
  };
  const onFocus = () => {
    isFocus.value = true;
    handleSearch(modelValue.value);
    recentlyFocus(latestSource?.value);
    transInputFocusEmit.value && transInputFocusEmit.value();
  };
  const onBlur = () => {
    isFocus.value = false;
    ctx.emit('blur');
  };
  const onClear = () => {
    ctx.emit('update:modelValue', '');
    ctx.emit('clear');
  };
  const handleClose = () => {
    visible.value = false;
    searchStatus.value = false;
    showNoResultItemTemplate.value = false;
  };
  const toggleMenu = () => {
    if (!isDisabled.value) {
      if (visible.value) {
        handleClose();
      } else {
        visible.value = true;
        if (ctx.slots.noResultItemTemplate && searchList.value.length === 0 && modelValue.value.trim() !== '') {
          showNoResultItemTemplate.value = true;
        }
      }
    }
  };
  return {
    handleClose,
    toggleMenu,
    onInput,
    onFocus,
    onBlur,
    onClear,
    isFocus,
    inputRef,
    visible,
    searchStatus,
  };
}