// Copyright (c) 2018 Open Networking Foundation
//
// 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.

syntax = "proto3";
package bbsim;

import "voltha_protos/openolt.proto";
import "voltha_protos/tech_profile.proto";
// Models

message PONPort {
    int32 ID = 1;
    string OperState = 2;
}

message NNIPort {
    int32 ID = 1;
    string OperState = 2;
}

message Olt {
    int32 ID = 1;
    string SerialNumber = 2;
    string OperState = 3;
    string InternalState = 4;
    repeated NNIPort NNIPorts = 5;
    repeated PONPort PONPorts = 6;
}

message ONU {
    int32 ID = 1;
    string SerialNumber = 2;
    string OperState = 3;
    string InternalState = 4;
    int32 PonPortID = 5;
    int32 STag = 6;
    int32 CTag = 7;
    string HwAddress = 8;
    int32 PortNo = 9;
}

message ONUTrafficSchedulers {
    tech_profile.TrafficSchedulers traffSchedulers = 1;
}

message ONUs {
    repeated ONU items = 1;
}

// Inputs

message ONURequest {
    string SerialNumber = 1;
}

// Alarms

message AlarmType {
    // These types correspond to the messages permitted in the oneof
    // in AlarmIndication in the openolt protos
    enum Types {
        LOS = 0; // LOS is an OLT alarm for an entire PON
        DYING_GASP = 1;
        ONU_ALARM = 2;
        ONU_STARTUP_FAILURE = 3;
        ONU_SIGNAL_DEGRADE = 4;
        ONU_DRIFT_OF_WINDOW = 5;
        ONU_LOSS_OF_OMCI_CHANNEL = 6;
        ONU_SIGNALS_FAILURE = 7;
        ONU_TRANSMISSION_INTERFERENCE_WARNING = 8;
        ONU_ACTIVATION_FAILURE = 9;
        ONU_PROCESSING_ERROR = 10;
        ONU_LOSS_OF_KEY_SYNC_FAILURE = 11;
        ONU_ITU_PON_STATS = 12;

        // These break out ONU_ALARM, which is a single message, but
        // includes statuses for these six alarms.
        ONU_ALARM_LOS = 13;
        ONU_ALARM_LOB = 14;
        ONU_ALARM_LOPC_MISS = 15;
        ONU_ALARM_LOPC_MIC_ERROR = 16;
        ONU_ALARM_LOFI = 17;
        ONU_ALARM_LOAMI = 18;
    }
}

message AlarmParameter {
    string Key = 1;
    string Value = 2;
}

// ONUAlarmRequest includes fields common to every Onu alarm,
// plus an optional list of AlarmParameter list that can be used
// to set additional fields in alarms that support them.
message ONUAlarmRequest {
    string AlarmType = 1;                   // name of alarm to raise
    string SerialNumber = 2;                // serial number of ONU
    string Status = 3;                      // status of Alarm
    repeated AlarmParameter Parameters = 4; // optional list of additional parameters
}

// OLT alarm request
message OLTAlarmRequest {
    uint32 InterfaceID = 1;                 // Switch Interface Id
    string InterfaceType = 2;                // PON or NNI Type
    string Status = 3;                      // Interface Operstatus
}

// Utils

message VersionNumber {
    string version = 1;
    string buildTime = 2;
    string commitHash = 3;
    string gitStatus = 4;
}

message LogLevel {
    string level = 1;
    bool caller = 2;
}

message Response {
    int32 status_code = 1;
    string message = 2;
}

enum SubActionTypes {
    JOIN = 0;
    LEAVE = 1;
    JOINV3 = 2;
}

message IgmpRequest {
	ONURequest OnuReq = 1;
	SubActionTypes SubActionVal = 2;
}

message Flows {
    uint32 flow_count = 1;
    repeated openolt.Flow flows = 2;
}

message Empty {}

service BBSim {
    rpc Version(Empty) returns (VersionNumber) {}
    rpc GetOlt(Empty) returns (Olt) {}
    rpc PoweronOlt(Empty) returns (Response) {}
    rpc ShutdownOlt(Empty) returns (Response) {}
    rpc RebootOlt(Empty) returns (Response) {}
    rpc GetONUs(Empty) returns (ONUs) {}
    rpc GetONU(ONURequest) returns (ONU) {}
    rpc SetLogLevel(LogLevel) returns (LogLevel) {}
    rpc ShutdownONU (ONURequest) returns (Response) {}
    rpc PoweronONU (ONURequest) returns (Response) {}
    rpc RestartEapol (ONURequest) returns (Response) {}
    rpc RestartDhcp (ONURequest) returns (Response) {}
    rpc SetOnuAlarmIndication (ONUAlarmRequest) returns (Response) {}
    rpc SetOltAlarmIndication (OLTAlarmRequest) returns (Response) {}
    rpc GetFlows(ONURequest) returns(Flows) {} 
    rpc ChangeIgmpState (IgmpRequest) returns (Response) {}
    rpc GetOnuTrafficSchedulers (ONURequest) returns (ONUTrafficSchedulers) {}
}
