/*
 * Copyright 2018-2023 Open Networking Foundation (ONF) and the ONF Contributors
 *
 * Licensed 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.opencord.aaa;

import org.onlab.packet.RADIUS;
import org.onosproject.event.ListenerService;

/**
 * Service for interacting with operational status module.
 */

public interface RadiusOperationalStatusService extends
             ListenerService<RadiusOperationalStatusEvent, RadiusOperationalStatusEventListener> {
   /**
     * Return RadiusOperationalStatusEventDelegate object.
     *
     * @return RadiusOperationalStatusEventDelegate
    */
    RadiusOperationalStatusEventDelegate getRadiusOprStDelegate();

    /**
     * Return String object.
     *
     * @return String
    */
    String getRadiusServerOperationalStatus();

    /**
     * Set the value of statusServerReqSent flag.
     *
     * @param statusServerReqSent statusServerReqSent flag
    */
    void setStatusServerReqSent(boolean statusServerReqSent);

    /**
     * Set the value of radiusOperationalStatus Evaluation Mode.
     *
     * @param radiusOperationalStatusEvaluationMode radiusOperationalStatusEvaluationMode value
    */
    void setRadiusOperationalStatusEvaluationMode(
            RadiusOperationalStatusEvaluationMode radiusOperationalStatusEvaluationMode);

    /**
     * Set the value of Operational Status Server Timeout In Milliseconds.
     *
     * @param operationalStatusServerTimeoutInMillis operationalStatusServerTimeoutInMillis
    */
    void setOperationalStatusServerTimeoutInMillis(long operationalStatusServerTimeoutInMillis);

    /**
     * Determine the operational status of server.
    */
    void checkServerOperationalStatus();

    /**
     * Check if radius response is for operational status.
     *
     * @param identifier identifier value of radius packet
     * @return boolean
    */
    boolean isRadiusResponseForOperationalStatus(byte identifier);

    /**
     * handle incoming radius packet for operational status.
     *
     * @param radiusPacket radiusPacket of incoming operational status
    */
    void handleRadiusPacketForOperationalStatus(RADIUS radiusPacket);

    /**
     * initialize radiusOperationalStatusService.
     *
     * @param address address of radius server
     * @param secret secret key for radius server
     * @param impl impl of RadiusCommunicator
    */
    void initialize(byte[] address, String secret, RadiusCommunicator impl);

    /**
     * set packet outgoing time in milliseconds.
     *
     * @param identifier identifier of outgoing packet
    */
    void setOutTimeInMillis(byte identifier);

    enum OperationalStatus {
        UNAVAILABLE,
        UNKNOWN,
        IN_USE,
    }

    enum RadiusOperationalStatusEvaluationMode {

        STATUS_REQUEST, ACCESS_REQUEST, AUTO;

        public static RadiusOperationalStatusEvaluationMode getValue(String value) {

            for (RadiusOperationalStatusEvaluationMode mode: RadiusOperationalStatusEvaluationMode.values()) {
                if (mode.toString().equalsIgnoreCase(value)) {
                   return mode;
                }
            }
            return null;
        }
    }

}
