import angular from 'angular';

angular.module('portainer.agent').factory('VolumeBrowserService', VolumeBrowserServiceFactory);

function VolumeBrowserServiceFactory(StateManager, Browse, BrowseVersion1, API_ENDPOINT_ENDPOINTS, EndpointProvider, Upload) {
  return {
    ls,
    get,
    delete: deletePath,
    rename,
    upload,
  };

  function getAgentApiVersion() {
    const state = StateManager.getState();
    return state.endpoint.agentApiVersion;
  }

  function getBrowseService() {
    const agentVersion = getAgentApiVersion();
    return agentVersion > 1 ? Browse : BrowseVersion1;
  }

  function ls(volumeId, path) {
    return getBrowseService().ls({ volumeID: volumeId, path, version: getAgentApiVersion() }).$promise;
  }

  function get(volumeId, path) {
    return getBrowseService().get({ volumeID: volumeId, path, version: getAgentApiVersion() }).$promise;
  }

  function deletePath(volumeId, path) {
    return getBrowseService().delete({ volumeID: volumeId, path, version: getAgentApiVersion() }).$promise;
  }

  function rename(volumeId, path, newPath) {
    const payload = {
      CurrentFilePath: path,
      NewFilePath: newPath,
    };
    return getBrowseService().rename({ volumeID: volumeId, version: getAgentApiVersion() }, payload).$promise;
  }

  function upload(path, file, volumeId, onProgress) {
    const agentVersion = StateManager.getAgentApiVersion();
    if (agentVersion < 2) {
      throw new Error('upload is not supported on this agent version');
    }

    const url = `${API_ENDPOINT_ENDPOINTS}/${EndpointProvider.endpointID()}/docker/v${agentVersion}/browse/put?volumeID=${volumeId}`;

    return new Promise((resolve, reject) => {
      Upload.upload({
        url: url,
        data: { file, Path: path },
      }).then(resolve, reject, onProgress);
    });
  }
}
