package canary

import (
	"time"

	"github.com/michaelquigley/df/dl"
	"github.com/openziti/zrok/v2/util"
)

type LooperOptions struct {
	Iterations     uint
	StatusInterval uint
	Timeout        time.Duration
	MinPayload     uint64
	MaxPayload     uint64
	MinDwell       time.Duration
	MaxDwell       time.Duration
	MinPacing      time.Duration
	MaxPacing      time.Duration
	BatchSize      uint
	MinBatchPacing time.Duration
	MaxBatchPacing time.Duration
	TargetName     string
	BindAddress    string
	FrontendScheme string
	FrontendPort   uint16
	SnapshotQueue  chan *Snapshot
}

type LooperResults struct {
	StartTime  time.Time
	StopTime   time.Time
	Loops      uint
	Errors     uint
	Mismatches uint
	Bytes      uint64
}

func ReportLooperResults(results []*LooperResults) {
	totalBytes := uint64(0)
	totalXferRate := uint64(0)
	totalErrors := uint(0)
	totalMismatches := uint(0)
	totalLoops := uint(0)
	for i, result := range results {
		totalBytes += result.Bytes
		deltaSeconds := result.StopTime.Sub(result.StartTime).Seconds()
		xferRate := uint64(float64(result.Bytes) / deltaSeconds)
		totalXferRate += xferRate
		totalErrors += result.Errors
		totalMismatches += result.Mismatches
		totalLoops += result.Loops
		dl.Infof("looper #%d: %d loops, %v, %d errors, %d mismatches, %s/sec", i, result.Loops, util.BytesToSize(int64(result.Bytes)), result.Errors, result.Mismatches, util.BytesToSize(int64(xferRate)))
	}
	dl.Infof("total: %d loops, %v, %d errors, %d mismatches, %s/sec", totalLoops, util.BytesToSize(int64(totalBytes)), totalErrors, totalMismatches, util.BytesToSize(int64(totalXferRate)))
}
