import { render, screen } from '@testing-library/react'
import { createMemoryHistory } from 'history'
import { Route, Router } from 'react-router-dom'

import { TidbMgmtContainer } from './TidbMgmtContainer'

const mockUseTiDBServiceGetTidb = jest.fn()

jest.mock('ahooks', () => ({
  useRafInterval: jest.fn(),
  useUnmount: jest.fn()
}))

jest.mock('mobx-react', () => ({
  observer: (component: unknown) => component
}))

jest.mock('@tidbcloud/uikit', () => ({
  Box: ({ children }: { children: React.ReactNode }) => <div>{children}</div>
}))

jest.mock('dbaas/components/Placeholder', () => ({
  PageLoader: () => <div data-testid="page-loader" />,
  DelayedPageLoader: () => <div data-testid="delayed-page-loader" />
}))

jest.mock('dbaas/contexts/access-control', () => ({
  PageAccessGuard: ({ children }: { children: React.ReactNode }) => <>{children}</>
}))

jest.mock('dbaas/features/ClusterManagement/cluster', () => ({
  getSharedCluster: jest.fn()
}))

jest.mock('dbaas/services/api-clients/v2023/cluster-management/v1beta2', () => ({
  useTiDBServiceGetTidb: (...args: unknown[]) => mockUseTiDBServiceGetTidb(...args)
}))

jest.mock('dbaas/stores/useStores', () => ({
  __esModule: true,
  default: () => ({
    store: {
      tenantData: { id: 'org-1' }
    },
    actions: {
      setCurrentTiDB: jest.fn(),
      setCurrentCluster: jest.fn(),
      updateLastVisitLocation: jest.fn()
    }
  })
}))

jest.mock('../../ClusterV2/Container/helpers', () => ({
  useClusterDashboard: () => jest.fn(),
  useClusterStatusHandler: () => jest.fn(),
  useNavbarHidden: () => false
}))

jest.mock('../../ClusterV2/Container/Navbar', () => () => <div data-testid="cluster-navbar" />)
jest.mock('../../ClusterV2/Container/Routes', () => () => <div data-testid="cluster-routes" />)

jest.mock('../essential/Routes', () => ({
  EssentialV2Nav: () => <div data-testid="essential-v2-nav" />,
  EssentialV2Routes: () => <div data-testid="essential-v2-routes" />
}))

jest.mock('./Routes', () => ({
  TiDBMgmtNav: () => <div data-testid="premium-nav" />,
  TiDBMgmtRoutes: () => <div data-testid="premium-routes" />
}))

describe('TidbMgmtContainer', () => {
  beforeEach(() => {
    mockUseTiDBServiceGetTidb.mockReset()
  })

  it('routes Essential V2 instances to the Essential V2 layout', () => {
    mockUseTiDBServiceGetTidb.mockReturnValue({
      data: {
        tidbId: 'tidb-1',
        originalProjectId: 'project-1',
        essentialV2Instance: {
          tidbId: 'tidb-1',
          displayName: 'Essential V2',
          maxRcu: '4000',
          regionId: 'aws-us-west-2',
          servicePlan: 'Essential_V2',
          labels: {
            'tidb.cloud/project': 'project-1'
          }
        }
      },
      isLoading: false,
      isError: false,
      refetch: jest.fn()
    })

    const history = createMemoryHistory({ initialEntries: ['/tidbs/tidb-1'] })

    render(
      <Router history={history}>
        <Route path="/tidbs/:id">
          <TidbMgmtContainer />
        </Route>
      </Router>
    )

    expect(screen.getByTestId('essential-v2-nav')).toBeTruthy()
    expect(screen.getByTestId('essential-v2-routes')).toBeTruthy()
    expect(screen.queryByTestId('premium-nav')).toBeNull()
  })
})
