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

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

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) {}
}
