// 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;
    string IP = 7;
    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) {}
}
