import { isFulfilled } from '@/portainer/helpers/promise-utils';
import { getInfo } from '@/react/docker/proxy/queries/useInfo';
import { aggregateData, getPlugins } from '@/react/docker/proxy/queries/usePlugins';

angular.module('portainer.docker').factory('PluginService', PluginServiceFactory);

/* @ngInject */
function PluginServiceFactory(AngularToReact) {
  const { useAxios, injectEnvironmentId } = AngularToReact;

  return {
    volumePlugins: useAxios(injectEnvironmentId(volumePlugins)), // volume create
    networkPlugins: useAxios(injectEnvironmentId(networksPlugins)), // network create
    loggingPlugins: useAxios(injectEnvironmentId(loggingPlugins)), // service create + service edit
  };
}

/**
 * @param {EnvironmentId} environmentId Injected
 * @param {boolean} systemOnly
 */
async function volumePlugins(environmentId, systemOnly) {
  const { systemPluginsData, pluginsData } = await getAllPlugins(environmentId);
  return aggregateData(systemPluginsData, pluginsData, systemOnly, 'Volume');
}

/**
 * @param {EnvironmentId} environmentId Injected
 * @param {boolean} systemOnly
 */
async function networksPlugins(environmentId, systemOnly) {
  const { systemPluginsData, pluginsData } = await getAllPlugins(environmentId);
  return aggregateData(systemPluginsData, pluginsData, systemOnly, 'Network');
}

/**
 * @param {EnvironmentId} environmentId Injected
 * @param {boolean} systemOnly
 */
async function loggingPlugins(environmentId, systemOnly) {
  const { systemPluginsData, pluginsData } = await getAllPlugins(environmentId);
  return aggregateData(systemPluginsData, pluginsData, systemOnly, 'Log');
}

async function getAllPlugins(environmentId) {
  const [system, plugins] = await Promise.allSettled([getInfo(environmentId), getPlugins(environmentId)]);
  const systemPluginsData = isFulfilled(system) ? system.value.Plugins : undefined;
  const pluginsData = isFulfilled(plugins) ? plugins.value : undefined;

  return { systemPluginsData, pluginsData };
}