// Copyright 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.

package main

// configuration
type BrokerInfo struct {
	Name        string   `yaml: name`
	Host        string   `yaml: host`
	Description string   `yaml: description`
	Topics      []string `yaml: topics`
}

type LoggerInfo struct {
	LogLevel string `yaml: loglevel`
	Host     string `yaml: host`
}

type TargetInfo struct {
	Type        string `yaml: type`
	Name        string `yaml: name`
	Port        int    `yaml: port`
	Description string `yaml: description`
}

type ConvInfo struct {
	Onusnhex  bool `yaml: onusnhex`
}

type Config struct {
	Broker BrokerInfo `yaml: broker`
	Logger LoggerInfo `yaml: logger`
	Target TargetInfo `yaml: "target"`
	Conv   ConvInfo   `yaml: "conv"`
}

// KPI Events format
type Metrics struct {
	TxBytes            float64 `json:"tx_bytes"`
	TxPackets          float64 `json:"tx_packets"`
	TxErrorPackets     float64 `json:"tx_error_packets"`
	TxBcastPackets     float64 `json:"tx_bcast_packets"`
	TxUnicastPackets   float64 `json:"tx_ucast_packets"`
	TxMulticastPackets float64 `json:"tx_mcast_packets"`
	RxBytes            float64 `json:"rx_bytes"`
	RxPackets          float64 `json:"rx_packets"`
	RxErrorPackets     float64 `json:"rx_error_packets"`
	RxBcastPackets     float64 `json:"rx_bcast_packets"`
	RxMulticastPackets float64 `json:"rx_mcast_packets"`

	LaserBiasCurrent       float64 `json:"laser_bias_current"`
	Temperature            float64 `json:"temperature"`
	PowerFeedVoltage       float64 `json:"power_feed_voltage"`
	MeanOpticalLaunchPower float64 `json:"mean_optical_launch_power"`
	ReceivedOpticalPower   float64 `json:"received_optical_power"`

	// ONU Ethernet_Bridge_Port_history
	Packets float64 `json:"packets"`
	Octets  float64 `json:"octets"`
}

type Context struct {
	InterfaceID string `json:"intf_id"`
	PonID       string `json:"pon_id"`
	PortNumber  string `json:"port_no"`

	// ONU Performance Metrics
	ParentClassId  string `json:"parent_class_id"`
	ParentEntityId string `json:"parent_entity_id"`
	Upstream       string `json:"upstream"`
}

type Metadata struct {
	LogicalDeviceID string   `json:"logical_device_id"`
	Title           string   `json:"title"`
	SerialNumber    string   `json:"serial_no"`
	Timestamp       float64  `json:"ts"`
	DeviceID        string   `json:"device_id"`
	Context         *Context `json:"context"`
}

type SliceData struct {
	Metrics  *Metrics  `json:"metrics"`
	Metadata *Metadata `json:"metadata"`
}

type VolthaKPI struct {
	Type       string       `json:"type"`
	Timestamp  float64      `json:"ts"`
	SliceDatas []*SliceData `json:"slice_data"`
}

type OnosPort struct {
	PortID        string  `json:"portId"`
	RxPackets     float64 `json:"pktRx"`
	TxPackets     float64 `json:"pktTx"`
	RxBytes       float64 `json:"bytesRx"`
	TxBytes       float64 `json:"bytesTx"`
	RxPacketsDrop float64 `json:"pktRxDrp"`
	TxPacketsDrop float64 `json:"pktTxDrp"`
}

type OnosKPI struct {
	DeviceID string      `json:"deviceId"`
	Ports    []*OnosPort `json:"ports"`
}

type ImporterKPI struct {
	PortId           string
	LaserBiasCurrent float64
	Temperature      float64
	TxPower          float64
	Voltage          float64
}

type OnosAaaKPI struct {
	RxAcceptResponses     float64 `json:"acceptResponsesRx"`
	RxRejectResponses     float64 `json:"rejectResponsesRx"`
	RxChallengeResponses  float64 `json:"challengeResponsesRx"`
	TxAccessRequests      float64 `json:"accessRequestsTx"`
	RxInvalidValidators   float64 `json:"invalidValidatorsRx"`
	RxUnknownType         float64 `json:"unknownTypeRx"`
	PendingRequests       float64 `json:"pendingRequests"`
	RxDroppedResponses    float64 `json:"droppedResponsesRx"`
	RxMalformedResponses  float64 `json:"malformedResponsesRx"`
	RxUnknownserver       float64 `json:"unknownServerRx"`
	RequestRttMillis      float64 `json:"requestRttMillis"`
	RequestReTx           float64 `json:"requestReTx"`
	RxEapolLogoff         float64 `json:"eapolLogoffRx"`
	TxEapolResIdentityMsg float64 `json:"eapolResIdentityMsgTrans"`
	TxAuthSuccess         float64 `json:"eapolAuthSuccessTrans"`
	TxAuthFailure         float64 `json:"eapolAuthFailureTrans"`
	TxStartReq            float64 `json:"eapolStartReqTrans"`
	EapPktTxAuthChooseEap float64 `json:"eapPktTxauthChooseEap"`
	TxResponseNotNak      float64 `json:"eapolTransRespNotNak"`
	EapolFramesTx         float64 `json:"eapolFramesTx"`
	AuthStateIdle         float64 `json:"authStateIdle"`
	RequestIdFramesTx     float64 `json:"requestIdFramesTx"`
	RequestEapFramesTx    float64 `json:"requestEapFramesTx"`
	InvalidPktType        float64 `json:"invalidPktType"`
	InvalidBodyLength     float64 `json:"invalidBodyLength"`
	ValidEapolFramesRx    float64 `json:"validEapolFramesRx"`
	PendingResSupplicant  float64 `json:"pendingResSupplicant"`
	RxResIdEapFrames      float64 `json:"resIdEapFramesRx"`
}

type OnosBngKPI struct {
	Mac             string   `json:"macAddress"`
	Ip              string   `json:"ipAddress"`
	PppoeSessionId  int      `json:"pppoeSessionId"`
	AttachmentType  string   `json:"attachmentType"`
	STag            int      `json:"sTag"`
	CTag            int      `json:"cTag"`
	OnuSerialNumber string   `json:"onuSerialNumber"`
	DeviceId        string   `json:"deviceId"`
	PortNumber      string   `json:"portNumber"`
	UpTxBytes       *float64 `json:"upTxBytes,omitempty"`
	UpTxPackets     *float64 `json:"upTxPackets,omitempty"`
	UpRxBytes       *float64 `json:"upRxBytes,omitempty"`
	UpRxPackets     *float64 `json:"upRxPackets,omitempty"`
	UpDropBytes     *float64 `json:"upDropBytes,omitempty"`
	UpDropPackets   *float64 `json:"upDropPackets,omitempty"`
	DownRxBytes     *float64 `json:"downRxBytes,omitempty"`
	DownRxPackets   *float64 `json:"downRxPackets,omitempty"`
	DownTxBytes     *float64 `json:"downTxBytes,omitempty"`
	DownTxPackets   *float64 `json:"downTxPackets,omitempty"`
	DownDropBytes   *float64 `json:"downDropBytes,omitempty"`
	DownDropPackets *float64 `json:"downDropPackets,omitempty"`
	ControlPackets  *float64 `json:"controlPackets,omitempty"`
	Timestamp       string   `json:"timestamp"`
}
