/**
 * BaseSelect provide some parsed data into context.
 * You can use this hooks to get them.
 */

import type { InjectionKey } from 'vue';
import { inject, provide } from 'vue';
import type { TreeProps } from '../tree';
import type { DataEntity, IconType } from '../vc-tree/interface';
import type { InternalDataEntity, Key, LegacyDataNode, RawValueType } from './interface';

export interface LegacyContextProps {
  checkable: boolean;
  checkedKeys: Key[];
  customCheckable: () => any;
  halfCheckedKeys: Key[];
  treeExpandedKeys: Key[];
  treeDefaultExpandedKeys: Key[];
  onTreeExpand: (keys: Key[]) => void;
  treeDefaultExpandAll: boolean;
  treeIcon: IconType;
  showTreeIcon: boolean;
  switcherIcon: IconType;
  treeLine: TreeProps['showLine'];
  treeNodeFilterProp: string;
  treeLoadedKeys: Key[];
  treeMotion: any;
  loadData: (treeNode: LegacyDataNode) => Promise<unknown>;
  onTreeLoad: (loadedKeys: Key[]) => void;

  keyEntities: Record<RawValueType, DataEntity<any>>;

  customSlots: {
    title?: (data: InternalDataEntity) => any;
    treeCheckable: () => any;
    [key: string]: ((...args: any[]) => any) | undefined;
  };
}

const TreeSelectLegacyContextPropsKey: InjectionKey<LegacyContextProps> = Symbol(
  'TreeSelectLegacyContextPropsKey',
);

// export const LegacySelectContext = defineComponent({
//  compatConfig: { MODE: 3 },
//   name: 'SelectContext',
//   props: {
//     value: { type: Object as PropType<LegacyContextProps> },
//   },
//   setup(props, { slots }) {
//     provide(
//       TreeSelectLegacyContextPropsKey,
//       computed(() => props.value),
//     );
//     return () => slots.default?.();
//   },
// });

export function useProvideLegacySelectContext(props: LegacyContextProps) {
  return provide(TreeSelectLegacyContextPropsKey, props);
}

export default function useInjectLegacySelectContext() {
  return inject(TreeSelectLegacyContextPropsKey, {} as LegacyContextProps);
}