/*
* Copyright 2018-2023 Open Networking Foundation (ONF) and the ONF Contributors

* 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 stats

import (
	"context"
	"time"
)

type CollectorName string

const (
	OltAdapter CollectorName = "adapter_olt"
	OnuAdapter CollectorName = "adapter_onu"
	VCore      CollectorName = "rw_core"
)

func (s CollectorName) String() string {
	switch s {
	case OltAdapter:
		return "adapter_olt"
	case OnuAdapter:
		return "adapter_onu"
	case VCore:
		return "rw_core"
	}
	return "unknown"
}

type StatsManager interface {
	// Start starts the statistics manager with name and makes the collected stats available at port p.
	Start(ctx context.Context, p int, name CollectorName)

	//CountForDevice counts the number of times the counterName happens for device devId with serial number sn. Each call to Count increments it by one.
	CountForDevice(devId, sn string, counterName DeviceCounter)

	//AddForDevice adds val to counter.
	AddForDevice(devId, sn string, counter DeviceCounter, val float64)

	//CollectDurationForDevice calculates the duration from startTime to time.Now() for device devID with serial number sn.
	CollectDurationForDevice(devID, sn string, dName NonDeviceDuration, startTime time.Time)

	//Count counts the number of times the counterName happens. Each call to Count increments it by one.
	Count(counter NonDeviceCounter)

	//Add adds val to counter.
	Add(counter NonDeviceCounter, val float64)

	//CollectDuration calculates the duration from startTime to time.Now().
	CollectDuration(dName NonDeviceDuration, startTime time.Time)
}

type NullStatsServer struct {
}

func (n *NullStatsServer) Start(ctx context.Context, p int, name CollectorName)              {}
func (n *NullStatsServer) CountForDevice(devId, sn string, counterName DeviceCounter)        {}
func (n *NullStatsServer) AddForDevice(devId, sn string, counter DeviceCounter, val float64) {}
func (n *NullStatsServer) CollectDurationForDevice(devID, sn string, dName NonDeviceDuration, startTime time.Time) {
}
func (n *NullStatsServer) Count(counter NonDeviceCounter)                               {}
func (n *NullStatsServer) Add(counter NonDeviceCounter, val float64)                    {}
func (n *NullStatsServer) CollectDuration(dName NonDeviceDuration, startTime time.Time) {}
