import React, { ReactNode, Ref, RefObject } from 'react'

interface GlobalConfigT {
  /**
   * Must be an Element or a parameter of querySelector
   *
   * Default: undefined
   * */
  portalDom?: Element | string
}

/**
 * Global config for setting default props of component
 * */
declare const GlobalConfig: GlobalConfigT

declare function getPortalDom(
  portalDom?: GlobalConfigT['portalDom'],
): Element | null | undefined

interface OverlayProps {
  /**
   * 是否强制显示
   * */
  forceShow?: boolean
  /**
   * 是否允许监听 escape 按键
   * Enable to listen the escape key
   *
   * Default: true
   * */
  enableEscape?: boolean
  /**
   * 是否允许监听点击事件以关闭浮层
   * Enable to listen the click event to close overlay
   *
   * Default: true
   * */
  enableClick?: boolean
  /**
   * 如果值存在，则使用 createPortal 将浮层提取到 portalDom
   * If portalDom is not undefined, the overlay will be extract to portalDom via createPortal
   *
   * Default: getPortalDom(GlobalConfig.portalDom)
   * */
  portalDom?: GlobalConfigT['portalDom']
  children?: ReactNode

  /**
   * 在浮层关闭之后触发的回调
   * A callback function that will be call after overlay closed
   * */
  onClose?(): void

  /**
   * 在浮层打开之后触发的回调
   * A callback function that will be call after overlay opened
   * */
  onOpen?(): void
}

interface OverlayRefProps {
  open(): void

  close(): void
}

declare const Overlay: React.ForwardRefExoticComponent<
  OverlayProps & React.RefAttributes<OverlayRefProps>
>

interface ModalProps extends OverlayProps {
  title?: ReactNode
  /**
   * Default: true
   * */
  showClose?: boolean
  className?: string
}

declare const Modal: React.ForwardRefExoticComponent<
  ModalProps & React.RefAttributes<OverlayRefProps>
>

interface ConfirmTexts {
  ok?: ReactNode
  cancel?: ReactNode
}

interface ConfirmModalProps extends ModalProps {
  content?: ReactNode
  texts?: ConfirmTexts

  onOk?(): any

  onCancel?(): any
}

declare const ConfirmModal: React.ForwardRefExoticComponent<
  ConfirmModalProps & React.RefAttributes<OverlayRefProps>
>

declare global {
  interface Window {
    GlobalConfirmModal?: {
      open(props: ConfirmModalProps): void
      close(): void
    }
  }
}

declare class GlobalConfirmModal {
  static id: string

  static open(props: ConfirmModalProps): void

  static close(): void

  private static render
}

/**
 * 直到组件状态第一次被置为可见，否则直接返回空的 dom（可以减少一些初始化逻辑的运行）
 * Return the empty dom directly until the component state is first made visible
 * */
declare function useShouldRender(visible: boolean): boolean

declare function useDeliveryRef(
  ref: Ref<OverlayRefProps>,
): {
  overlayRef: RefObject<OverlayRefProps>
  methods: {
    open(): void
    close(): void
  }
}

export {
  ConfirmModal,
  ConfirmModalProps,
  ConfirmTexts,
  GlobalConfig,
  GlobalConfigT,
  GlobalConfirmModal,
  Modal,
  ModalProps,
  Overlay,
  OverlayProps,
  OverlayRefProps,
  getPortalDom,
  useDeliveryRef,
  useShouldRender,
}
