import { BASE_API_URL, PROJECT_ID } from '@/constants';
import { FIRST_ARRAY_ELEMENT } from '@/constants/common';
import { backgroundsFixture } from '@/models/fixtures/backgroundsFixture';
import { modelsFixture } from '@/models/fixtures/modelsFixture';
import { INITIAL_STORE_STATE_MOCK } from '@/redux/root/root.fixtures';
import { RootState } from '@/redux/store';
import { getReduxWrapperWithStore } from '@/utils/testing/getReduxWrapperWithStore';
import { renderHook } from '@testing-library/react';
import { HISTAMINE_MAP_ID } from '@/constants/mocks';
import { useGetSubmapDownloadUrl } from './useGetSubmapDownloadUrl';

const VALID_HANDLER = 'lcsb.mapviewer.wikipathway.GpmlParser';
const VALID_MODEL_ID = HISTAMINE_MAP_ID;
const VALID_BACKGROUND_ID = 53;
const VALID_MAX_ZOOM = 9;

const getState = ({
  modelId,
  backgroundId,
  mapSizeMaxZoom,
}: {
  modelId: number;
  backgroundId: number;
  mapSizeMaxZoom: number;
}): RootState => ({
  ...INITIAL_STORE_STATE_MOCK,
  map: {
    ...INITIAL_STORE_STATE_MOCK.map,
    data: {
      ...INITIAL_STORE_STATE_MOCK.map.data,
      modelId,
      backgroundId,
      size: {
        ...INITIAL_STORE_STATE_MOCK.map.data.size,
        maxZoom: mapSizeMaxZoom,
      },
    },
  },
  models: {
    ...INITIAL_STORE_STATE_MOCK.models,
    data: [
      {
        ...modelsFixture[FIRST_ARRAY_ELEMENT],
        id: VALID_MODEL_ID,
      },
    ],
  },
  backgrounds: {
    ...INITIAL_STORE_STATE_MOCK.backgrounds,
    data: [
      {
        ...backgroundsFixture[FIRST_ARRAY_ELEMENT],
        id: VALID_BACKGROUND_ID,
      },
    ],
  },
});

describe('useGetSubmapDownloadUrl - hook', () => {
  describe('when not all params valid', () => {
    const cases = [
      {
        modelId: 0,
        backgroundId: VALID_BACKGROUND_ID,
        mapSizeMaxZoom: VALID_MAX_ZOOM,
        handler: VALID_HANDLER,
      },
      {
        modelId: VALID_MODEL_ID,
        backgroundId: 0,
        mapSizeMaxZoom: VALID_MAX_ZOOM,
        handler: VALID_HANDLER,
      },
      {
        modelId: VALID_MODEL_ID,
        backgroundId: VALID_BACKGROUND_ID,
        mapSizeMaxZoom: 0,
        handler: VALID_HANDLER,
      },
      {
        modelId: VALID_MODEL_ID,
        backgroundId: VALID_BACKGROUND_ID,
        mapSizeMaxZoom: VALID_MAX_ZOOM,
        handler: '',
      },
    ];

    it.each(cases)('should return empty string', ({ handler, ...stateParams }) => {
      const { Wrapper } = getReduxWrapperWithStore(getState(stateParams));

      const {
        result: { current: getSubmapDownloadUrl },
      } = renderHook(() => useGetSubmapDownloadUrl(), { wrapper: Wrapper });

      expect(getSubmapDownloadUrl({ handler, modelId: 0 })).toBe('');
    });
  });

  describe('when all params valid', () => {
    it('should return valid string', () => {
      const { Wrapper } = getReduxWrapperWithStore(
        getState({
          modelId: VALID_MODEL_ID,
          backgroundId: VALID_BACKGROUND_ID,
          mapSizeMaxZoom: VALID_MAX_ZOOM,
        }),
      );

      const {
        result: { current: getSubmapDownloadUrl },
      } = renderHook(() => useGetSubmapDownloadUrl(), { wrapper: Wrapper });

      expect(getSubmapDownloadUrl({ handler: VALID_HANDLER, modelId: HISTAMINE_MAP_ID })).toBe(
        `${BASE_API_URL}/projects/${PROJECT_ID}/models/${HISTAMINE_MAP_ID}:downloadModel?backgroundOverlayId=53&handlerClass=lcsb.mapviewer.wikipathway.GpmlParser&zoomLevel=9`,
      );
    });
  });
});