package metrics

import (
	"sync"
)

type ServerMetrics interface {
	NewClient()
	CloseClient()
	NewProxy(name string, proxyType string)
	CloseProxy(name string, proxyType string)
	OpenConnection(name string, proxyType string)
	CloseConnection(name string, proxyType string)
	AddTrafficIn(name string, proxyType string, trafficBytes int64)
	AddTrafficOut(name string, proxyType string, trafficBytes int64)
}

var Server ServerMetrics = noopServerMetrics{}

var registerMetrics sync.Once

func Register(m ServerMetrics) {
	registerMetrics.Do(func() {
		Server = m
	})
}

type noopServerMetrics struct{}

func (noopServerMetrics) NewClient()                          {}
func (noopServerMetrics) CloseClient()                        {}
func (noopServerMetrics) NewProxy(string, string)             {}
func (noopServerMetrics) CloseProxy(string, string)           {}
func (noopServerMetrics) OpenConnection(string, string)       {}
func (noopServerMetrics) CloseConnection(string, string)      {}
func (noopServerMetrics) AddTrafficIn(string, string, int64)  {}
func (noopServerMetrics) AddTrafficOut(string, string, int64) {}