package workload

import (
	"net/url"
	"strconv"
	"strings"
	"time"
)

// run workload steps
// 1. SET GLOBAL tidb_multi_statement_mode='ON'
// 2. create database pp, ppdb1, ppdb5
// 3. /go-ycsb-paypay/go-ycsb load mysql -p workload=wallet -p mysql.host=src-tidb-tidb -p mysql.user=root -p mysql.port=4000 -p mysql.db=pp -p db1name=ppdb1 -p db5name=ppdb5 -p operationcount=10000000000000 -p recordcount=10000 -p ignore1=true -p ignore5=true -p threadcount=10 -p clientcount=1 -p clientid=0
// 4. /go-ycsb-paypay/go-ycsb load mysql -p workload=wallet -p mysql.host=src-tidb-tidb -p mysql.user=root -p mysql.port=4000 -p mysql.db=pp -p db1name=ppdb1 -p db5name=ppdb5 -p operationcount=10000000000000 -p recordcount=10000 -p ignore1=false -p ignore5=true -p threadcount=10 -p clientcount=1 -p clientid=0
// 5. /go-ycsb-paypay/go-ycsb run mysql -p workload=wallet -p mysql.host=src-tidb-tidb -p mysql.user=root -p mysql.port=4000 -p mysql.db=pp -p db1name=ppdb1 -p db5name=ppdb5 -p operationcount=10000000000000 -p recordcount=10000 -p ignore1=false -p ignore5=true -p threadcount=10 -p clientcount=1 -p clientid=0

const ()

type PayPayOption struct {
	// stage can only be `load` or `run`
	Command        CommandType
	PropertyFile   string `json:"filter"`
	PropertyValues []string
	Threads        int

	Duration time.Duration

	DB string
}

func (o *PayPayOption) Parse(dbURL *url.URL) *CMD {
	var (
		cmd    = "/go-ycsb-paypay/go-ycsb " + o.Command.String() + " mysql "
		params []string
	)
	if o.PropertyFile != "" {
		params = append(params, "-P "+o.PropertyFile)
	}

	o.PropertyValues = append(o.PropertyValues, "mysql.host="+dbURL.Hostname())
	o.PropertyValues = append(o.PropertyValues, "mysql.port="+dbURL.Port())
	for _, item := range o.PropertyValues {
		params = append(params, "-p "+item)
	}
	params = append(params, "--threads="+strconv.Itoa(o.Threads))

	cmd = cmd + strings.Join(params, " ")
	timeout := o.Duration + time.Minute*10
	return NewCMD(cmd, timeout)
}

func (o *PayPayOption) SetCommand(command CommandType) {
	o.Command = command
}

func (o *PayPayOption) GetTableNames() []string {
	return nil
}
