package performance

import (
	"github.com/measurement-kit/go-measurement-kit"
	"github.com/ooni/probe-cli/nettests"
)

// NDT test implementation
type NDT struct {
}

// Run starts the test
func (n NDT) Run(ctl *nettests.Controller) error {
	nt := mk.NewNettest("Ndt")
	ctl.Init(nt)
	return nt.Run()
}

// NDTSummary for the test
type NDTSummary struct {
	Upload     int64
	Download   int64
	Ping       int64
	MaxRTT     float64
	AvgRTT     float64
	MinRTT     float64
	MSS        int64
	OutOfOrder int64
	PacketLoss float64
	Timeouts   int64
}

// Summary generates a summary for a test run
func (n NDT) Summary(tk map[string]interface{}) interface{} {
	simple := tk["simple"].(map[string]interface{})
	advanced := tk["advanced"].(map[string]interface{})

	return NDTSummary{
		Upload:     int64(simple["upload"].(float64)),
		Download:   int64(simple["download"].(float64)),
		Ping:       int64(simple["ping"].(float64)),
		MaxRTT:     advanced["max_rtt"].(float64),
		AvgRTT:     advanced["avg_rtt"].(float64),
		MinRTT:     advanced["min_rtt"].(float64),
		MSS:        int64(advanced["mss"].(float64)),
		OutOfOrder: int64(advanced["out_of_order"].(float64)),
		PacketLoss: advanced["packet_loss"].(float64),
		Timeouts:   int64(advanced["timeouts"].(float64)),
	}
}

// LogSummary writes the summary to the standard output
func (n NDT) LogSummary(s string) error {
	return nil
}