package netstat

import (
	// "log"
	// "log"
	"sync"
	"time"

	"wartank/pkg/types"
)

/*
	Сетевая статистика для сетевого соединения
*/

// NetStat -- статистика сетевого соединения
type NetStat struct {
	server       types.IServer
	countByte    int      // Счётчик переданных/полученных байтов
	totalByte    int      // Сколько всего байт передано вообще
	totalMinut   int      // Сколько всего минут работала передача
	countRequest int      // Число запросов
	countErr     int      // Число зафиксированных ошибок
	chTick       chan int // Сигналы времени
	block        sync.Mutex
}

// NewNetStat -- возвращает новый *NetStat
func NewNetStat(server types.IServer) *NetStat {
	sf := &NetStat{
		server: server,
		chTick: make(chan int, 2),
	}
	go sf.run()
	go sf.makeTick()
	return sf
}

// Тикер меток времени
func (sf *NetStat) makeTick() {
	defer close(sf.chTick)
	for {
		select {
		case <-sf.server.Done():
			return
		default:
			time.Sleep(time.Second * 5 * 60)
			sf.totalMinut += 5
			sf.chTick <- 1
		}
	}
}

// Главный цикл работы статистики
func (sf *NetStat) run() {
	for range sf.chTick {
		select {
		case <-sf.server.Done():
			return
		case <-sf.chTick:
			sf.block.Lock()
			// mbyte := float32(sf.totalByte) / float32(sf.totalMinut*60) * (3600 * 24 * 30.5) / (1024 * 1024)
			// log._rintf("INFO NetStat.run(): запросы=%0.2f/сек\tтраф0=%0.2f бит/сек\tтраф1=%0.2f МБ/мес\tошибки=%v\n",
			// float32(sf.countRequest)/300, float32(sf.countByte*8)/300, mbyte, sf.countErr)
			sf.countByte = 0
			sf.countRequest = 0
			sf.block.Unlock()
		}
	}
}

// AddByte -- увеличивает счётчик запросов и байтов на передачу/приём
func (sf *NetStat) AddByte(val int) {
	sf.block.Lock()
	defer sf.block.Unlock()
	if val < 0 {
		// log._rintf("ERRO NatStat.AddByte(): val(%v)<0\n", val)
		sf.countErr++
		return
	}
	sf.countByte += val
	sf.totalByte += val
	sf.countRequest++
}
