import { inject, provide, reactive } from 'vue'
import type { InjectionKey } from 'vue'

import type { ConfigOptions as MessageConfig, MessageInstance } from '../message/interface'
import type { ModalStaticFunctions } from '../modal/confirm'
import type { NotificationConfig, NotificationInstance } from '../notification/interface'

export interface AppConfig {
  message?: MessageConfig
  notification?: NotificationConfig
}

export const AppConfigContextKey: InjectionKey<AppConfig> = Symbol('appConfigContext')

export const useProvideAppConfigContext = (appConfigContext: AppConfig) => {
  return provide(AppConfigContextKey, appConfigContext)
}

export const useInjectAppConfigContext = () => {
  return inject(AppConfigContextKey, {})
}

type ModalType = Omit<ModalStaticFunctions, 'warn'>

export interface useAppProps {
  message: MessageInstance
  notification: NotificationInstance
  modal: ModalType
}

export const AppContextKey: InjectionKey<useAppProps> = Symbol('appContext')

export const useProvideAppContext = (appContext: useAppProps) => {
  return provide(AppContextKey, appContext)
}

const defaultAppContext: useAppProps = reactive({
  message: {},
  notification: {},
  modal: {},
} as useAppProps)

export const useInjectAppContext = () => {
  return inject(AppContextKey, defaultAppContext)
}
