import { DatabaseApplicationType } from '@baserow/modules/database/applicationTypes'
import { GridViewType } from '@baserow/modules/database/viewTypes'
import {
  TextFieldType,
  LongTextFieldType,
  URLFieldType,
  EmailFieldType,
  LinkRowFieldType,
  NumberFieldType,
  BooleanFieldType,
  DateFieldType,
  FileFieldType,
  SingleSelectFieldType,
  PhoneNumberFieldType,
} from '@baserow/modules/database/fieldTypes'
import {
  EqualViewFilterType,
  NotEqualViewFilterType,
  DateEqualViewFilterType,
  DateNotEqualViewFilterType,
  ContainsViewFilterType,
  FilenameContainsViewFilterType,
  ContainsNotViewFilterType,
  HigherThanViewFilterType,
  LowerThanViewFilterType,
  SingleSelectEqualViewFilterType,
  SingleSelectNotEqualViewFilterType,
  BooleanViewFilterType,
  EmptyViewFilterType,
  NotEmptyViewFilterType,
  DateEqualsTodayViewFilterType,
  DateEqualsCurrentMonthViewFilterType,
  DateEqualsCurrentYearViewFilterType,
  DateBeforeViewFilterType,
  DateAfterViewFilterType,
} from '@baserow/modules/database/viewFilters'
import {
  CSVImporterType,
  PasteImporterType,
  XMLImporterType,
  JSONImporterType,
} from '@baserow/modules/database/importerTypes'
import { APITokenSettingsType } from '@baserow/modules/database/settingsTypes'

import tableStore from '@baserow/modules/database/store/table'
import viewStore from '@baserow/modules/database/store/view'
import fieldStore from '@baserow/modules/database/store/field'
import gridStore from '@baserow/modules/database/store/view/grid'

import { registerRealtimeEvents } from '@baserow/modules/database/realtime'
import { CSVTableExporterType } from '@baserow/modules/database/exporterTypes'

export default ({ store, app }) => {
  store.registerModule('table', tableStore)
  store.registerModule('view', viewStore)
  store.registerModule('field', fieldStore)
  store.registerModule('page/view/grid', gridStore)
  store.registerModule('template/view/grid', gridStore)

  app.$registry.register('application', new DatabaseApplicationType())
  app.$registry.register('view', new GridViewType())
  app.$registry.register('viewFilter', new EqualViewFilterType())
  app.$registry.register('viewFilter', new NotEqualViewFilterType())
  app.$registry.register('viewFilter', new DateEqualViewFilterType())
  app.$registry.register('viewFilter', new DateNotEqualViewFilterType())
  app.$registry.register('viewFilter', new DateEqualsTodayViewFilterType())
  app.$registry.register(
    'viewFilter',
    new DateEqualsCurrentMonthViewFilterType()
  )
  app.$registry.register(
    'viewFilter',
    new DateEqualsCurrentYearViewFilterType()
  )
  app.$registry.register('viewFilter', new DateBeforeViewFilterType())
  app.$registry.register('viewFilter', new DateAfterViewFilterType())
  app.$registry.register('viewFilter', new ContainsViewFilterType())
  app.$registry.register('viewFilter', new FilenameContainsViewFilterType())
  app.$registry.register('viewFilter', new ContainsNotViewFilterType())
  app.$registry.register('viewFilter', new HigherThanViewFilterType())
  app.$registry.register('viewFilter', new LowerThanViewFilterType())
  app.$registry.register('viewFilter', new SingleSelectEqualViewFilterType())
  app.$registry.register('viewFilter', new SingleSelectNotEqualViewFilterType())
  app.$registry.register('viewFilter', new BooleanViewFilterType())
  app.$registry.register('viewFilter', new EmptyViewFilterType())
  app.$registry.register('viewFilter', new NotEmptyViewFilterType())
  app.$registry.register('field', new TextFieldType())
  app.$registry.register('field', new LongTextFieldType())
  app.$registry.register('field', new LinkRowFieldType())
  app.$registry.register('field', new NumberFieldType())
  app.$registry.register('field', new BooleanFieldType())
  app.$registry.register('field', new DateFieldType())
  app.$registry.register('field', new URLFieldType())
  app.$registry.register('field', new EmailFieldType())
  app.$registry.register('field', new FileFieldType())
  app.$registry.register('field', new SingleSelectFieldType())
  app.$registry.register('field', new PhoneNumberFieldType())
  app.$registry.register('importer', new CSVImporterType())
  app.$registry.register('importer', new PasteImporterType())
  app.$registry.register('importer', new XMLImporterType())
  app.$registry.register('importer', new JSONImporterType())
  app.$registry.register('settings', new APITokenSettingsType())
  app.$registry.register('exporter', new CSVTableExporterType())

  registerRealtimeEvents(app.$realtime)
}