import { getBounds } from '@/services/pluginsManager/map/data/getBounds';
import { fitBounds } from '@/services/pluginsManager/map/fitBounds';
import { getOpenMapId } from '@/services/pluginsManager/map/getOpenMapId';
import { triggerSearch } from '@/services/pluginsManager/map/triggerSearch';
import { getModels } from '@/services/pluginsManager/map/models/getModels';
import { openMap } from '@/services/pluginsManager/map/openMap';
import { getCenter } from '@/services/pluginsManager/map/position/getCenter';
import { setCenter } from '@/services/pluginsManager/map/position/setCenter';
import { getZoom } from '@/services/pluginsManager/map/zoom/getZoom';
import { setZoom } from '@/services/pluginsManager/map/zoom/setZoom';
import { getDisease } from '@/services/pluginsManager/project/data/getDisease';
import { getName } from '@/services/pluginsManager/project/data/getName';
import { getOrganism } from '@/services/pluginsManager/project/data/getOrganism';
import { getProjectId } from '@/services/pluginsManager/project/data/getProjectId';
import { getVersion } from '@/services/pluginsManager/project/data/getVersion';
import { getDataOverlays } from '@/services/pluginsManager/map/overlays/getDataOverlays';
import { getVisibleDataOverlays } from '@/services/pluginsManager/map/overlays/getVisibleDataOverlays';
import { showDataOverlay } from '@/services/pluginsManager/map/overlays/showDataOverlay';
import { hideDataOverlay } from '@/services/pluginsManager/map/overlays/hideDataOverlay';
import { removeDataOverlay } from '@/services/pluginsManager/map/overlays/removeDataOverlay';
import { addDataOverlay } from '@/services/pluginsManager/map/overlays/addDataOverlay';
import { getApiUrls } from '@/services/pluginsManager/project/data/getApiUrls';
import { getOpenedPanel } from '@/services/pluginsManager/interface/getOpenedPanel';
import { hidePanel } from '@/services/pluginsManager/interface/hidePanel';

type Plugin = {
  pluginName: string;
  pluginVersion: string;
  pluginUrl: string;
  withoutPanel: boolean | undefined;
};

type RegisterPlugin = ({ pluginName, pluginVersion, pluginUrl }: Plugin) => {
  element: HTMLDivElement;
};

type HashPlugin = {
  pluginUrl: string;
  pluginScript: string;
};

declare global {
  interface Window {
    config: {
      BASE_API_URL: string;
      BASE_NEW_API_URL: string;
      BASE_MAP_IMAGES_URL: string;
      DEFAULT_PROJECT_ID: string;
      ADMIN_PANEL_URL: string;
    };

    // plugins try to access those in the previous version of minerva
    minervaDefine: typeof minervaDefine;

    minerva: {
      configuration?: MinervaConfiguration;
      plugins: {
        registerPlugin: RegisterPlugin;
      };
      data: {
        bioEntities: BioEntitiesMethods;
      };
      map: {
        data: {
          getBounds: typeof getBounds;
          getOpenMapId: typeof getOpenMapId;
          getModels: typeof getModels;
        };
        fitBounds: typeof fitBounds;
        openMap: typeof openMap;
        triggerSearch: typeof triggerSearch;
        getZoom: typeof getZoom;
        setZoom: typeof setZoom;
        getCenter: typeof getCenter;
        setCenter: typeof setCenter;
      };
      interface: {
        getOpenedPanel: typeof getOpenedPanel;
        hidePanel: typeof hidePanel;
        openPanel: typeof openPanel;
      };
      overviewImage: {
        getCurrentOverviewImage: typeof getCurrentOverviewImage;
        getOverviewImages: typeof getOverviewImages;
        hideOverviewImageModal: typeof hideOverviewImageModal;
        selectOverviewImage: typeof selectOverviewImage;
        showOverviewImageModal: typeof showOverviewImageModal;
      };
      overlays: {
        data: {
          getDataOverlays: typeof getDataOverlays;
          getVisibleDataOverlays: typeof getVisibleDataOverlays;
        };
        showDataOverlay: typeof showDataOverlay;
        hideDataOverlay: typeof hideDataOverlay;
        removeDataOverlay: typeof removeDataOverlay;
        addDataOverlay: typeof addDataOverlay;
      };
      project: {
        data: {
          getProjectId: typeof getProjectId;
          getName: typeof getName;
          getVersion: typeof getVersion;
          getDisease: typeof getDisease;
          getOrganism: typeof getOrganism;
          getApiUrls: typeof getApiUrls;
        };
      };
    };
  }
}