// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements.  See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership.  The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License.  You may obtain a copy of the License at
//
//   http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied.  See the License for the
// specific language governing permissions and limitations
// under the License.

package org.apache.cloudstack.storage.datastore.client;

import java.net.URISyntaxException;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.util.List;
import java.util.Map;

import org.apache.cloudstack.storage.datastore.api.Sdc;
import org.apache.cloudstack.storage.datastore.api.SnapshotGroup;
import org.apache.cloudstack.storage.datastore.api.StoragePool;
import org.apache.cloudstack.storage.datastore.api.StoragePoolStatistics;
import org.apache.cloudstack.storage.datastore.api.Volume;
import org.apache.cloudstack.storage.datastore.api.VolumeStatistics;

import com.cloud.storage.Storage;

public interface ScaleIOGatewayClient {
    String GATEWAY_API_ENDPOINT = "powerflex.gw.url";
    String GATEWAY_API_USERNAME = "powerflex.gw.username";
    String GATEWAY_API_PASSWORD = "powerflex.gw.password";
    String STORAGE_POOL_NAME = "powerflex.storagepool.name";
    String STORAGE_POOL_SYSTEM_ID = "powerflex.storagepool.system.id";
    /**
     * Storage Pool Metadata Management (MDM) IP address(es).
     */
    String STORAGE_POOL_MDMS = "powerflex.storagepool.mdms";
    String SDC_ID = "powerflex.sdc.id";
    String SDC_GUID = "powerflex.sdc.guid";

    static ScaleIOGatewayClient getClient(final String url, final String username, final String password,
                                          final boolean validateCertificate, final int timeout, final int maxConnections) throws NoSuchAlgorithmException, KeyManagementException, URISyntaxException {
        return new ScaleIOGatewayClientImpl(url, username, password, validateCertificate, timeout, maxConnections);
    }

    // Volume APIs
    Volume createVolume(final String name, final String storagePoolId,
                        final Integer sizeInGb, final Storage.ProvisioningType volumeType);
    List<Volume> listVolumes();
    List<Volume> listSnapshotVolumes();
    Volume getVolume(String volumeId);
    Volume getVolumeByName(String name);
    boolean renameVolume(final String volumeId, final String newName);
    Volume resizeVolume(final String volumeId, final Integer sizeInGb);
    Volume cloneVolume(final String sourceVolumeId, final String destVolumeName);
    boolean deleteVolume(final String volumeId);
    boolean migrateVolume(final String srcVolumeId, final String destPoolId, final int timeoutInSecs);

    boolean mapVolumeToSdc(final String volumeId, final String sdcId);
    boolean mapVolumeToSdcWithLimits(final String volumeId, final String sdcId, final Long iopsLimit, final Long bandwidthLimitInKbps);
    boolean unmapVolumeFromSdc(final String volumeId, final String sdcId);
    boolean unmapVolumeFromAllSdcs(final String volumeId);
    boolean isVolumeMappedToSdc(final String volumeId, final String sdcId);

    // Snapshot APIs
    SnapshotGroup takeSnapshot(final Map<String, String> srcVolumeDestSnapshotMap);
    boolean revertSnapshot(final String systemId, final Map<String, String> srcSnapshotDestVolumeMap);
    int deleteSnapshotGroup(final String systemId, final String snapshotGroupId);
    Volume takeSnapshot(final String volumeId, final String snapshotVolumeName);
    boolean revertSnapshot(final String sourceSnapshotVolumeId, final String destVolumeId);

    // Storage Pool APIs
    List<StoragePool> listStoragePools();
    StoragePool getStoragePool(String poolId);
    StoragePoolStatistics getStoragePoolStatistics(String poolId);
    VolumeStatistics getVolumeStatistics(String volumeId);
    String getSystemId(String protectionDomainId);
    List<Volume> listVolumesInStoragePool(String poolId);
    List<Volume> listVolumesMappedToSdc(String sdcId);

    // SDC APIs
    List<Sdc> listSdcs();
    Sdc getSdc(String sdcId);
    String getSdcIdByGuid(String sdcGuid);
    Sdc getSdcByIp(String ipAddress);
    Sdc getConnectedSdcByIp(String ipAddress);
    int getConnectedSdcsCount();
    boolean haveConnectedSdcs();
    boolean isSdcConnected(String sdcId);
    boolean isSdcConnectedByIP(String ipAddress);

    List<String> getMdmAddresses();
}
