angular.module('portainer.agent').factory('VolumeBrowserService', [
  'StateManager',
  'Browse',
  'BrowseVersion1',
  '$q',
  'API_ENDPOINT_ENDPOINTS',
  'EndpointProvider',
  'Upload',
  function VolumeBrowserServiceFactory(StateManager, Browse, BrowseVersion1, $q, API_ENDPOINT_ENDPOINTS, EndpointProvider, Upload) {
    'use strict';
    var service = {};

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

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

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

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

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

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

    service.upload = function upload(path, file, volumeId, onProgress) {
      var deferred = $q.defer();
      var agentVersion = StateManager.getAgentApiVersion();
      if (agentVersion < 2) {
        deferred.reject('upload is not supported on this agent version');
        return;
      }
      var url = API_ENDPOINT_ENDPOINTS + '/' + EndpointProvider.endpointID() + '/docker' + '/v' + agentVersion + '/browse/put?volumeID=' + volumeId;

      Upload.upload({
        url: url,
        data: { file: file, Path: path },
      }).then(deferred.resolve, deferred.reject, onProgress);
      return deferred.promise;
    };

    return service;
  },
]);
