import { useParams } from 'common'
import { useRouter } from 'next/router'
import type { CommandOptions, ICommand } from 'ui-patterns/CommandMenu'
import { useRegisterCommands, useSetCommandMenuOpen } from 'ui-patterns/CommandMenu'
import { IRouteCommand } from 'ui-patterns/CommandMenu/internal/types'

import { COMMAND_MENU_SECTIONS } from '@/components/interfaces/App/CommandMenu/CommandMenu.utils'
import { useIsPlatformWebhooksEnabled } from '@/components/interfaces/App/FeaturePreview/FeaturePreviewContext'
import { useIsFeatureEnabled } from '@/hooks/misc/useIsFeatureEnabled'

export function useProjectSettingsGotoCommands(options?: CommandOptions) {
  const router = useRouter()
  const setIsOpen = useSetCommandMenuOpen()
  let { ref, slug } = useParams()
  const platformWebhooksEnabled = useIsPlatformWebhooksEnabled()
  ref ||= '_'
  const hasOrgSlug = typeof slug === 'string' && slug.length > 0 && slug !== '_'

  const {
    logsAll,
    projectSettingsLogDrains,
    projectSettingsCustomDomains,
    authenticationSignInProviders,
  } = useIsFeatureEnabled([
    'logs:all',
    'project_settings:log_drains',
    'project_settings:custom_domains',
    'authentication:sign_in_providers',
  ])

  // Log drains depend on the analytics backend, gated by logs:all (see SettingsMenu.utils).
  const showLogDrains = logsAll && projectSettingsLogDrains

  useRegisterCommands(
    COMMAND_MENU_SECTIONS.NAVIGATE,
    [
      {
        id: 'nav-project-settings-add-ons',
        name: 'Add-ons',
        value: 'Add-ons addons add ons add on add-on',
        route: `/project/${ref}/settings/addons`,
        defaultHidden: true,
      },
      {
        id: 'nav-project-settings-general',
        name: 'General Settings',
        route: `/project/${ref}/settings/general`,
        defaultHidden: true,
      },
      {
        id: 'nav-project-settings-database',
        name: 'Database Settings',
        route: `/project/${ref}/database/settings`,
        defaultHidden: true,
      },
      {
        id: 'nav-project-settings-auth',
        name: 'Auth Settings',
        route: authenticationSignInProviders
          ? `/project/${ref}/auth/providers`
          : `/project/${ref}/auth/policies`,
        defaultHidden: true,
      },
      ...(platformWebhooksEnabled
        ? [
            {
              id: 'nav-project-settings-webhooks',
              name: 'Project Webhooks',
              route: `/project/${ref}/settings/webhooks`,
              defaultHidden: true,
            } as IRouteCommand,
            ...(hasOrgSlug
              ? [
                  {
                    id: 'nav-organization-settings-webhooks',
                    name: 'Organization Webhooks',
                    route: `/org/${slug}/webhooks`,
                    defaultHidden: true,
                  } as IRouteCommand,
                ]
              : []),
          ]
        : []),
      {
        id: 'nav-project-settings-api',
        name: 'API Settings',
        route: `/project/${ref}/integrations/data_api/settings`,
        defaultHidden: true,
      },
      {
        id: 'nav-project-settings-storage',
        name: 'Storage Settings',
        route: `/project/${ref}/storage/settings`,
        defaultHidden: true,
      },
      ...(projectSettingsCustomDomains
        ? [
            {
              id: 'nav-project-settings-custom-domains',
              name: 'Custom Domains',
              route: `/project/${ref}/settings/general#custom-domains`,
              defaultHidden: true,
            } as IRouteCommand,
          ]
        : []),
      {
        id: 'nav-project-settings-restart-project',
        name: 'Project availability',
        value: 'project availability restart project pause project resume project',
        route: `/project/${ref}/settings/general#restart-project`,
        defaultHidden: true,
      },
      {
        id: 'nav-project-settings-pause-project',
        name: 'Pause project',
        route: `/project/${ref}/settings/general#pause-project`,
        defaultHidden: true,
      },
      {
        id: 'nav-project-settings-transfer-project',
        name: 'Transfer project',
        route: `/project/${ref}/settings/general#transfer-project`,
        defaultHidden: true,
      },
      {
        id: 'nav-project-settings-delete-project',
        name: 'Delete project',
        route: `/project/${ref}/settings/general#delete-project`,
        defaultHidden: true,
      },
      {
        id: 'nav-project-settings-database-password',
        name: 'Database password',
        route: `/project/${ref}/database/settings#database-password`,
        defaultHidden: true,
      },
      {
        id: 'nav-project-settings-reset-database-password',
        name: 'Reset database password',
        route: `/project/${ref}/database/settings#database-password`,
        defaultHidden: true,
      },
      {
        id: 'nav-project-settings-connection-string',
        name: 'Connection string',
        action: () => {
          router.push(
            {
              pathname: router.pathname,
              query: { ...router.query, showConnect: 'true' },
            },
            undefined,
            { shallow: true }
          )
          setIsOpen(false)
        },
        defaultHidden: true,
      } as ICommand,
      {
        id: 'nav-project-settings-connection-pooling',
        name: 'Connection pooling',
        route: `/project/${ref}/database/settings#connection-pooler`,
        defaultHidden: true,
      },
      {
        id: 'nav-project-settings-ssl-configuration',
        name: 'SSL configuration',
        route: `/project/${ref}/database/settings#ssl-configuration`,
        defaultHidden: true,
      },
      {
        id: 'nav-project-settings-network-restrictions',
        name: 'Network restrictions',
        route: `/project/${ref}/database/settings#network-restrictions`,
        defaultHidden: true,
      },
      {
        id: 'nav-project-settings-banned-ips',
        name: 'Banned IPs',
        route: `/project/${ref}/database/settings#banned-ips`,
        defaultHidden: true,
      },
      ...(showLogDrains
        ? [
            {
              id: 'nav-project-settings-log-drains',
              name: 'Log drains',
              route: `/project/${ref}/settings/log-drains`,
              defaultHidden: true,
            } as IRouteCommand,
          ]
        : []),
    ],
    { ...options, deps: [platformWebhooksEnabled, showLogDrains, ref, slug] }
  )
}
