// 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/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;
}

// AlarmRequest includes fields common to every alarm,
// plus an optional list of AlarmParameter list that can be used
// to set additional fields in alarms that support them.
message AlarmRequest {
    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
}

// 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 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 SetAlarmIndication (AlarmRequest) returns (Response) {}
    rpc ChangeIgmpState (IgmpRequest) returns (Response) {}
    rpc GetOnuTrafficSchedulers (ONURequest) returns (ONUTrafficSchedulers) {}
}
