// 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, http;
        public static boolean isValidServiceType(String serviceType) {
            if (tcp.name().equalsIgnoreCase(serviceType) ||
                udp.name().equalsIgnoreCase(serviceType) ||
                http.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();

    @Override
    public long getAccountId();

    public State getState();

    public String getServiceType();
}
