package scenario

import (
	"encoding/json"
	"time"

	"github.com/pingcap/endless/pkg/workloadnode/cmdstr"
)

type Config struct {
	// Workload options.
	WorkloadName string                `json:"workloadName"`
	BettingOpts  cmdstr.BettingOptions `json:"bettingOpts"`
	QHAdOpts     cmdstr.QHAdOptions    `json:"qhadOpts"`

	RunTime time.Duration `json:"runTime"`
}

func DefaultConfig() Config {
	config := Config{}

	config.WorkloadName = "betting"
	config.RunTime = 2 * time.Hour

	// TODO: cmdstr.BettingOptions should have a default value for itself.
	config.BettingOpts.Threads = 100
	config.BettingOpts.OperationCount = 0
	config.BettingOpts.RecordCount = 0
	config.BettingOpts.Clients = 2
	config.BettingOpts.DatabaseProportion = 1
	config.BettingOpts.DBNamePrefix = "betting_"
	config.BettingOpts.TableCount = 1000
	config.BettingOpts.UnitNamePrefix = "unit_"
	config.BettingOpts.UnitCount = 10
	config.BettingOpts.UnitDistribution = "zipfian"

	// TODO: add default value for QHAdOpts.
	config.QHAdOpts.Threads = 100
	config.QHAdOpts.OperationCount = 0
	config.QHAdOpts.RecordCount = 0
	config.QHAdOpts.TableCount = 1000

	return config
}

// TODO: move jsonDuration to util package.
// ref: https://github.com/tikv/pd/blob/master/pkg/typeutil/duration.go
type jsonDuration struct {
	time.Duration
}

func (j *jsonDuration) UnmarshalJSON(b []byte) error {
	var s string
	if err := json.Unmarshal(b, &s); err != nil {
		return err
	}
	dur, err := time.ParseDuration(s)
	if err != nil {
		return err
	}
	*j = jsonDuration{dur}
	return nil
}
