import { computed, inject, onBeforeMount, onBeforeUnmount, ref } from 'vue';
import { OptionProps, UseOptionReturnType } from '../select-types';
import { SELECT_TOKEN, OPTION_GROUP_TOKEN } from '../const';
import { className } from '../utils';
import { useNamespace } from '../../../shared/hooks/use-namespace';
export default function useOption(props: OptionProps): UseOptionReturnType {
  const ns = useNamespace('select');
  const select = inject(SELECT_TOKEN, null);
  const optionGroup = inject(OPTION_GROUP_TOKEN, null);
  const currentName = computed(() => {
    return props.name || props.value;
  });

  const isOptionSelected = computed(() => {
    if (!select?.modelValue) {
      return false;
    }
    if (select?.multiple) {
      return Array.isArray(select.modelValue) && select.modelValue.includes(props.value);
    } else {
      return select.modelValue === props.value;
    }
  });

  const optionItem = computed(() => {
    return {
      name: props.name || props.value + '' || '',
      value: props.value,
      create: props.create,
      _checked: false,
    };
  });

  const isDisabled = computed(() => props.disabled || (optionGroup?.disabled ? true : false));

  const isObjectOption = ref(!!props.name);

  const selectOptionCls = computed(() => {
    return className(ns.e('item'), {
      active: isOptionSelected.value,
      disabled: isDisabled.value,
    });
  });

  const optionSelect = (): void => {
    if (!isDisabled.value) {
      select?.valueChange(optionItem.value);
    }
  };

  const isVisible = computed(() => {
    if (select?.filterQuery) {
      const query = select?.filterQuery.toLocaleLowerCase().trim();
      return currentName.value.toString().toLocaleLowerCase().includes(query);
    } else {
      return true;
    }
  });

  onBeforeMount(() => {
    select?.updateInjectOptions(optionItem.value, 'add', isObjectOption.value);
  });

  onBeforeUnmount(() => {
    select?.updateInjectOptions(optionItem.value, 'delete', isObjectOption.value);
  });

  return {
    currentName,
    selectOptionCls,
    isVisible,
    optionSelect,
  };
}