import * as ReactHookForm from 'react-hook-form'
import * as ReactRedux from 'react-redux'

import Router from '../../public/Router'
import { fetchConfiguration as fetchPublicConfiguration } from '../../public/services/api'
import { fetchConfiguration as fetchAdminConfiguration } from '../../admin/services/api'
import { Error, Hint, Label } from '@epicformbuilder/public/form/components'
import * as Form from '@epicformbuilder/public/data'
import * as API from '@epicformbuilder/public/services/api'

class ConfigurationLoader {
  private loaded = false

  async load( application: "public" | "admin" ): Promise<void> {
    if ( this.loaded ) return Promise.resolve()

    "public" === application ?
        await this.setGlobalPublicConfiguration() :
        await this.setGlobalAdminConfiguration()

    this.loaded  = true
  }

  async setGlobalAdminConfiguration(): Promise<void> {
    const data = await fetchAdminConfiguration()

    window.__EPICFORMBUILDER__ = Object.freeze( {
      ...window.__EPICFORMBUILDER__,
      __USER__: data.__USER__,
      __WP_SETTINGS__: data.__WP_SETTINGS__,
      __NAMED_ROUTES__: data.__NAMED_ROUTES__,
      __ROUTER__: new Router(data.__NAMED_ROUTES__),
      __PLUGINS__: data.__PLUGINS__,
      __REACTHOOKFORM__: ReactHookForm,
      __REACTREDUX__: ReactRedux,
      __COMPONENTS__: { Label, Hint, Error },
      __API__: API,
      __DATA__: Form,
    } )
  }

  async setGlobalPublicConfiguration(): Promise<void> {
    const data = await fetchPublicConfiguration()

    window.__EPICFORMBUILDER__ = Object.freeze( {
      ...window.__EPICFORMBUILDER__,
      __MADE_BY__: data.__MADE_BY__,
      __NAMED_ROUTES__: data.__NAMED_ROUTES__,
      __ROUTER__: new Router( data.__NAMED_ROUTES__ ),
      __PLUGINS__: data.__PLUGINS__,
      __REACTHOOKFORM__: ReactHookForm,
      __REACTREDUX__: ReactRedux,
      __COMPONENTS__: { Label, Hint, Error },
      __DATA__: Form,
      __API__: API,
    } )
  }
}

export default new ConfigurationLoader()
