// 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 com.cloud.offering;

import java.util.Date;

import org.apache.cloudstack.acl.InfrastructureEntity;
import org.apache.cloudstack.api.Identity;
import org.apache.cloudstack.api.InternalIdentity;

/**
 * offered.
 */
public interface ServiceOffering extends InfrastructureEntity, InternalIdentity, Identity {
    static final String consoleProxyDefaultOffUniqueName = "Cloud.com-ConsoleProxy";
    static final String ssvmDefaultOffUniqueName = "Cloud.com-SecondaryStorage";
    static final String routerDefaultOffUniqueName = "Cloud.Com-SoftwareRouter";
    static final String elbVmDefaultOffUniqueName = "Cloud.Com-ElasticLBVm";
    static final String internalLbVmDefaultOffUniqueName = "Cloud.Com-InternalLBVm";
    // leaving cloud.com references as these are identifyers and no real world addresses (check against DB)


    static final String PURGE_DB_ENTITIES_KEY = "purge.db.entities";

    enum State {
        Inactive, Active,
    }

    enum StorageType {
        local, shared
    }

    String getDisplayText();

    Date getCreated();

    /**
     * @return user readable description
     */
    String getName();

    /**
     * @return is this a system service offering
     */
    boolean isSystemUse();

    /**
     * @return # of cpu.
     */
    Integer getCpu();

    /**
     * @return speed in mhz
     */
    Integer getSpeed();

    /**
     * @return ram size in megabytes
     */
    Integer getRamSize();

    /**
     * @return Does this service plan offer HA?
     */
    boolean isOfferHA();

    /**
     * @return Does this service plan offer VM to use CPU resources beyond the service offering limits?
     */
    boolean getLimitCpuUse();

    /**
     * @return Does this service plan support Volatile VM that is, discard VM's root disk and create a new one on reboot?
     */
    boolean isVolatileVm();

    /**
     * @return the rate in megabits per sec to which a VM's network interface is throttled to
     */
    Integer getRateMbps();

    /**
     * @return the rate megabits per sec to which a VM's multicast&broadcast traffic is throttled to
     */
    Integer getMulticastRateMbps();

    /**
     * @return tag that should be present on the host needed, optional parameter
     */
    String getHostTag();

    boolean getDefaultUse();

    String getVmType();

    String getDeploymentPlanner();

    boolean isDynamic();

    void setState(ServiceOffering.State state);

    ServiceOffering.State getState();

    void setName(String name);

    String getUniqueName();

    void setUniqueName(String uniqueName);

    void setDisplayText(String displayText);

    boolean isCustomized();

    void setCustomized(boolean customized);

    Date getRemoved();

    void setRemoved(Date removed);

    void setSortKey(int key);

    int getSortKey();

    Long getDiskOfferingId();

    boolean isDynamicScalingEnabled();

    Boolean getDiskOfferingStrictness();

    void setDiskOfferingStrictness(boolean diskOfferingStrictness);

    Long getVgpuProfileId();

    Integer getGpuCount();
}
