import CollaborationClientEnUS from '@univerjs-pro/collaboration-client/locale/en-US'
import {
  IAuthzIoService,
  IMentionIOService,
  IUndoRedoService,
  LocaleType,
  mergeLocales,
  Univer,
  UniverInstanceType,
} from '@univerjs/core'
import { FUniver } from '@univerjs/core/facade'
import DesignEnUS from '@univerjs/design/locale/en-US'
import DocsUIEnUS from '@univerjs/docs-ui/locale/en-US'
import SheetsFormulaUIEnUS from '@univerjs/sheets-formula-ui/locale/en-US'
import SheetsNumfmtUIEnUS from '@univerjs/sheets-numfmt-ui/locale/en-US'
import SheetsUIEnUS from '@univerjs/sheets-ui/locale/en-US'
import SheetsEnUS from '@univerjs/sheets/locale/en-US'
import UIEnUS from '@univerjs/ui/locale/en-US'

import {
  CollaborationUnauthorizedError,
  createCollaborationClientConfig,
  createCollaborationSheetUnit,
  ensureCollaborationSession,
  getCollaborationBootstrapState,
  persistCollaborationUnitId,
  redirectToCollaborationLogin,
  replaceLocationWithCollaborationUnit,
} from './config'
import { WORKBOOK_DATA } from './data'
import { registerCollaborationPlugins, registerCorePlugins } from './function'

import '@univerjs-pro/collaboration-client/facade'
import '@univerjs-pro/collaboration-client-ui/facade'

import '@univerjs/design/lib/index.css'
import '@univerjs/docs-ui/lib/index.css'
import '@univerjs-pro/collaboration-client-ui/lib/index.css'
import '@univerjs/sheets-formula-ui/lib/index.css'
import '@univerjs/sheets-numfmt-ui/lib/index.css'
import '@univerjs/sheets-ui/lib/index.css'
import '@univerjs/ui/lib/index.css'

async function bootstrap() {
  const bootstrapState = getCollaborationBootstrapState()

  try {
    if (bootstrapState.enableCollaboration) {
      await ensureCollaborationSession()

      let unitId = bootstrapState.unitId

      if (!unitId) {
        unitId = await createCollaborationSheetUnit()
      }

      if (unitId) {
        persistCollaborationUnitId(unitId)

        if (bootstrapState.shouldUpdateUrl) {
          replaceLocationWithCollaborationUnit(unitId)
          return
        }
      }
    }
  } catch (error) {
    if (error instanceof CollaborationUnauthorizedError) {
      redirectToCollaborationLogin()
      return
    }

    throw error
  }

  const univer = new Univer({
    locale: LocaleType.EN_US,
    locales: {
      [LocaleType.EN_US]: mergeLocales(
        DesignEnUS,
        CollaborationClientEnUS,
        UIEnUS,
        DocsUIEnUS,
        SheetsEnUS,
        SheetsUIEnUS,
        SheetsFormulaUIEnUS,
        SheetsNumfmtUIEnUS,
      ),
    },
    override: [
      [IAuthzIoService, null],
      [IUndoRedoService, null],
      [IMentionIOService, null],
    ],
  })

  registerCorePlugins(univer, 'app')
  registerCollaborationPlugins(univer, createCollaborationClientConfig(bootstrapState.enableCollaboration))

  if (bootstrapState.enableCollaboration) {
    FUniver.newAPI(univer)
    return
  }

  univer.createUnit(UniverInstanceType.UNIVER_SHEET, WORKBOOK_DATA)
}

void bootstrap()