/*******************************************************************************
 * Copyright (c) 2015 Red Hat, Inc.
 * Distributed under license by Red Hat, Inc. All rights reserved.
 * This program is made available under the terms of the
 * Eclipse Public License v1.0 which accompanies this distribution,
 * and is available at http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     Red Hat, Inc. - initial API and implementation
 ******************************************************************************/
package com.openshift.restclient.model.volume;

import java.util.Set;

import com.openshift.internal.restclient.model.volume.PersistentVolume;
import com.openshift.restclient.model.IResource;
import com.openshift.restclient.model.volume.property.IPersistentVolumeProperties;
import com.openshift.restclient.utils.MemoryUnit;


public interface IPersistentVolume extends IResource {

	/**
	 * @param unit the designated unit. One of "Ki", "Mi", "Gi", "Ti", "Pi", "Ei".
	 * @return 0, if conversion not possible. Otherwise the capacity in given units.
	 * @see {@link PersistentVolume#convert(String, MemoryUnit)}
	 * @throws IllegalArgumentException if not supported {@code unit} given.
	 */
	long getCapacity(String unit);

	/**
	 * @param unit the designated unit. One of {@link MemoryUnit}'s Ki, Mi, Gi, Ti, Pi, Ei.
	 * @return 0, if conversion not possible. Otherwise the capacity in given units.
	 * @see {@link PersistentVolume#convert(String, MemoryUnit)}
	 * @throws IllegalArgumentException if not supported {@code unit} given.
	 */
	long getCapacity(MemoryUnit unit);

	/**
	 * @return the capacity in bytes.
	 */
	long getCapacity();

	/**
	 * @return the unit in which the capacity is represent.
	 *  @see {@link MemoryUnit}
	 */
	MemoryUnit getCapacityUnit();

	/**
	 * Sets the capacity. There is no conversion between units.
	 * @param capacity the capacity
	 * @param unit the unit
	 */
	void setCapacity(long capacity, MemoryUnit unit);

	/**
	 * @return access modes
	 * @see {@link com.openshift.restclient.model.volume.PVCAccessModes}
	 * @see
	 */
	Set<String> getAccessModes();

	/**
	 * Sets the access modes.
	 * If there are any modes present, they are overridden by the {@code modes} parameter.
	 * @param modes the access modes
	 */
	void setAccessModes(String... modes);

	/**
	 * @return the value of 'spec.persistentVolumeReclaimPolicy'
	 */
	String getReclaimPolicy();

	/**
	 * Sets the 'spec.persistentVolumeReclaimPolicy' value
	 * @param policy the policy string
	 */
	void setReclaimPolicy(String policy);

	/**
	 * @return specific persistent volume type properties
	 */
	IPersistentVolumeProperties getPersistentVolumeProperties();

	/**
	 * Sets the volume type properties.
	 * @param properties the properties
	 */
	void setPersistentVolumeProperties(IPersistentVolumeProperties properties);

}
