import { fileURLToPath } from 'node:url'
import path from 'path'

import { buildConfigWithDefaults } from '../buildConfigWithDefaults.js'
import { Array } from './collections/Array.js'
import { BaseListFilter } from './collections/BaseListFilter.js'
import { CollectionCustomDocumentControls } from './collections/CustomDocumentControls.js'
import { CustomFields } from './collections/CustomFields/index.js'
import { CustomListDrawer } from './collections/CustomListDrawer/index.js'
import { CustomViews1 } from './collections/CustomViews1.js'
import { CustomViews2 } from './collections/CustomViews2.js'
import { DisableBulkEdit } from './collections/DisableBulkEdit.js'
import { DisableCopyToLocale } from './collections/DisableCopyToLocale.js'
import { DisableDuplicate } from './collections/DisableDuplicate.js'
import { EditMenuItems } from './collections/editMenuItems.js'
import { FormatDocURL } from './collections/FormatDocURL/index.js'
import { Geo } from './collections/Geo.js'
import { CollectionGroup1A } from './collections/Group1A.js'
import { CollectionGroup1B } from './collections/Group1B.js'
import { CollectionGroup2A } from './collections/Group2A.js'
import { CollectionGroup2B } from './collections/Group2B.js'
import { CollectionHidden } from './collections/Hidden.js'
import { ListDrawer } from './collections/ListDrawer.js'
import { ListViewSelectAPI } from './collections/ListViewSelectAPI/index.js'
import { Localized } from './collections/Localized.js'
import { CollectionNoApiView } from './collections/NoApiView.js'
import { NoTimestampsCollection } from './collections/NoTimestamps.js'
import { CollectionNotInView } from './collections/NotInView.js'
import { Placeholder } from './collections/Placeholder.js'
import { Posts } from './collections/Posts.js'
import { ReorderTabs } from './collections/ReorderTabs.js'
import { UploadCollection } from './collections/Upload.js'
import { UploadTwoCollection } from './collections/UploadTwo.js'
import { UseAsTitleGroupField } from './collections/UseAsTitleGroupField.js'
import { Users } from './collections/Users.js'
import { Virtuals } from './collections/Virtuals.js'
import { with300Documents } from './collections/With300Documents.js'
import { GlobalCustomDocumentControls } from './globals/CustomDocumentControls.js'
import { CustomGlobalViews1 } from './globals/CustomViews1.js'
import { CustomGlobalViews2 } from './globals/CustomViews2.js'
import { Global } from './globals/Global.js'
import { GlobalGroup1A } from './globals/Group1A.js'
import { GlobalGroup1B } from './globals/Group1B.js'
import { GlobalHidden } from './globals/Hidden.js'
import { GlobalNoApiView } from './globals/NoApiView.js'
import { GlobalNotInView } from './globals/NotInView.js'
import { Settings } from './globals/Settings.js'
import { seed } from './seed.js'
import {
  BASE_PATH,
  customAdminRoutes,
  customNestedViewPath,
  customParamViewPath,
  customRootViewMetaTitle,
  customViewPath,
  protectedCustomNestedViewPath,
  publicCustomViewPath,
} from './shared.js'
import { editMenuItemsSlug, reorderTabsSlug } from './slugs.js'
process.env.NEXT_BASE_PATH = BASE_PATH

const filename = fileURLToPath(import.meta.url)
const dirname = path.dirname(filename)
export default buildConfigWithDefaults({
  admin: {
    components: {
      actions: ['/components/actions/AdminButton/index.js#AdminButton'],
      afterDashboard: [
        '/components/AfterDashboard/index.js#AfterDashboard',
        '/components/AfterDashboardClient/index.js#AfterDashboardClient',
      ],
      afterNav: ['/components/AfterNav/index.js#AfterNav'],
      afterNavLinks: ['/components/AfterNavLinks/index.js#AfterNavLinks'],
      beforeLogin: ['/components/BeforeLogin/index.js#BeforeLogin'],
      beforeNav: ['/components/BeforeNav/index.js#BeforeNav'],
      beforeNavLinks: ['/components/BeforeNavLinks/index.js#BeforeNavLinks'],
      graphics: {
        Icon: '/components/graphics/Icon.js#Icon',
        Logo: '/components/graphics/Logo.js#Logo',
      },
      header: ['/components/CustomHeader/index.js#CustomHeader'],
      logout: {
        Button: '/components/Logout/index.js#Logout',
      },
      providers: [
        '/components/CustomProviderServer/index.js#CustomProviderServer',
        '/components/CustomProvider/index.js#CustomProvider',
      ],
      settingsMenu: [
        '/components/SettingsMenuItems/Item1.tsx#SettingsMenuItem1',
        '/components/SettingsMenuItems/Item2.tsx#SettingsMenuItem2',
      ],
      views: {
        // Dashboard: CustomDashboardView,
        // Account: CustomAccountView,
        collections: {
          Component: '/components/views/CustomView/index.js#CustomView',
          path: '/collections',
        },
        CustomDefaultView: {
          Component: '/components/views/CustomDefault/index.js#CustomDefaultView',
          path: '/custom-default-view',
        },
        CustomMinimalView: {
          Component: '/components/views/CustomMinimal/index.js#CustomMinimalView',
          meta: {
            title: customRootViewMetaTitle,
          },
          path: '/custom-minimal-view',
        },
        CustomNestedView: {
          Component: '/components/views/CustomViewNested/index.js#CustomNestedView',
          exact: true,
          path: customNestedViewPath,
        },
        CustomView: {
          Component: '/components/views/CustomView/index.js#CustomView',
          exact: true,
          path: customViewPath,
          strict: true,
        },
        CustomViewWithParam: {
          Component: '/components/views/CustomViewWithParam/index.js#CustomViewWithParam',
          path: customParamViewPath,
        },
        ProtectedCustomNestedView: {
          Component: '/components/views/CustomProtectedView/index.js#CustomProtectedView',
          exact: true,
          path: protectedCustomNestedViewPath,
        },
        PublicCustomView: {
          Component: '/components/views/CustomView/index.js#CustomView',
          exact: true,
          path: publicCustomViewPath,
          strict: true,
        },
        ButtonShowcase: {
          Component: '/components/views/ButtonStyles/index.js#ButtonStyles',
          path: '/button-styles',
        },
      },
    },
    dependencies: {
      myTestComponent: {
        type: 'component',
        clientProps: {
          test: 'hello',
        },
        path: '/components/TestComponent.js#TestComponent',
      },
    },
    importMap: {
      baseDir: path.resolve(dirname),
    },
    livePreview: {
      collections: [reorderTabsSlug, editMenuItemsSlug],
      url: 'http://localhost:3000',
    },
    meta: {
      description: 'This is a custom meta description',
      icons: [
        {
          type: 'image/png',
          rel: 'icon',
          url: '/custom-favicon-dark.png',
        },
        {
          type: 'image/png',
          media: '(prefers-color-scheme: dark)',
          rel: 'icon',
          url: '/custom-favicon-light.png',
        },
      ],
      openGraph: {
        description: 'This is a custom OG description',
        title: 'This is a custom OG title',
      },
      titleSuffix: '- Custom Title Suffix',
    },
    routes: customAdminRoutes,
  },
  collections: [
    UploadCollection,
    UploadTwoCollection,
    Posts,
    Users,
    CollectionHidden,
    CollectionNotInView,
    CollectionNoApiView,
    CollectionCustomDocumentControls,
    CustomViews1,
    CustomViews2,
    ReorderTabs,
    CustomFields,
    CollectionGroup1A,
    CollectionGroup1B,
    CollectionGroup2A,
    CollectionGroup2B,
    Geo,
    Array,
    DisableDuplicate,
    DisableCopyToLocale,
    EditMenuItems,
    FormatDocURL,
    BaseListFilter,
    with300Documents,
    ListDrawer,
    Placeholder,
    UseAsTitleGroupField,
    DisableBulkEdit,
    CustomListDrawer,
    ListViewSelectAPI,
    Virtuals,
    NoTimestampsCollection,
    Localized,
  ],
  globals: [
    GlobalHidden,
    GlobalNotInView,
    GlobalNoApiView,
    Global,
    GlobalCustomDocumentControls,
    CustomGlobalViews1,
    CustomGlobalViews2,
    GlobalGroup1A,
    GlobalGroup1B,
    Settings,
  ],
  i18n: {
    translations: {
      en: {
        general: {
          dashboard: 'Home',
        },
      },
    },
  },
  localization: {
    defaultLocale: 'en',
    defaultLocalePublishOption: 'active',
    locales: [
      {
        code: 'es',
        label: {
          en: 'Spanish',
          es: 'Español',
        },
      },
      {
        code: 'en',
        label: {
          en: 'English',
          es: 'Inglés',
        },
      },
    ],
  },
  onInit: async (payload) => {
    if (process.env.SEED_IN_CONFIG_ONINIT !== 'false') {
      await seed(payload)
    }
  },
  typescript: {
    outputFile: path.resolve(dirname, 'payload-types.ts'),
  },
})
