// 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.region.ha;

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

/**
 * GlobalLoadBalancerRule defines a global (multi zone) load balancing configuration.
 */
public interface GlobalLoadBalancerRule extends Identity, InternalIdentity, ControlledEntity {

    enum Algorithm {

        RoundRobin,
        LeastConn,
        Proximity;

        public static boolean isValidAlgorithm(String algorithm) {
            if (RoundRobin.name().equalsIgnoreCase(algorithm) ||
                    LeastConn.name().equalsIgnoreCase(algorithm) ||
                    Proximity.name().equalsIgnoreCase(algorithm)) {
                return true;
            }
            return false;
        }
    }
    enum Persistence {

        sourceip;

        public static  boolean isValidPersistence(String persistence) {
            if (sourceip.name().equalsIgnoreCase(persistence)) {
                return true;
            }
            return false;
        }
    }

    enum ServiceType {
        tcp,
        udp;
        public static  boolean isValidServiceType(String serviceType) {
            if (tcp.name().equalsIgnoreCase(serviceType) || udp.name().equalsIgnoreCase(serviceType)) {
                return true;
            }
            return false;
        }
    }
    enum State {
        Staged,
        Add,
        Active,
        Revoke
    }

    public String getName();

    public String getDescription();

    public String getGslbDomain();

    public String getAlgorithm();

    public String getPersistence();

    public int getRegion();

    public long getAccountId();

    public State getState();

    public String getServiceType();
}
