import type { InjectionKey, Ref } from 'vue';
import { inject, provide } from 'vue';
import type { OnSelect, PanelMode } from './interface';

export type ContextOperationRefProps = {
  onKeydown?: (e: KeyboardEvent) => boolean;
  onClose?: () => void;
};

export type PanelContextProps = {
  operationRef?: Ref<ContextOperationRefProps | null>;
  /** Only work with time panel */
  hideHeader?: Ref<boolean>;
  panelRef?: Ref<HTMLDivElement>;
  hidePrevBtn?: Ref<boolean>;
  hideNextBtn?: Ref<boolean>;
  onDateMouseenter?: (date: any) => void;
  onDateMouseleave?: (date: any) => void;
  onSelect?: OnSelect<any>;
  hideRanges?: Ref<boolean>;
  open?: Ref<boolean>;
  mode?: Ref<PanelMode>;

  /** Only used for TimePicker and this is a deprecated prop */
  defaultOpenValue?: Ref<any>;

  /** Double click state for RangePicker */
  isDoubleClickRef?: Ref<boolean>;
};

const PanelContextKey: InjectionKey<PanelContextProps> = Symbol('PanelContextProps');

export const useProvidePanel = (props: PanelContextProps) => {
  provide(PanelContextKey, props);
};

export const useInjectPanel = () => {
  return inject(PanelContextKey, {});
};

export default PanelContextKey;
