package workload

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

type DmSysbenchOption struct {
	DB             string
	TableCount     int
	TableSize      int
	TestName       string
	Threads        int
	Duration       time.Duration
	ReportInterval int
	Debug          bool

	Command CommandType
}

func (o *DmSysbenchOption) Parse(dbURL *url.URL) *CMD {
	var (
		// for sysbench, at the moment we use percona/sysbench as image, which install sysbench at a system level
		// so that we just call `sysbench`
		cmd    = "sysbench "
		params []string
	)

	params = append(params, "--db-driver=mysql")
	params = append(params, "--mysql-host="+dbURL.Hostname())
	params = append(params, "--mysql-port="+dbURL.Port())
	params = append(params, "--mysql-user=root")

	params = append(params, "--mysql-db="+o.DB)
	params = append(params, "--tables="+strconv.Itoa(o.TableCount))
	params = append(params, "--table-size="+strconv.Itoa(o.TableSize))

	params = append(params, "--create_secondary=off")

	params = append(params, "--time="+strconv.Itoa(int(o.Duration.Seconds())))

	if o.ReportInterval != 0 {
		params = append(params, "--report-interval="+strconv.Itoa(o.ReportInterval))
	}

	params = append(params, "--threads="+strconv.Itoa(o.Threads))

	cmd = cmd + strings.Join(params, " ")

	cmd = cmd + " " + o.TestName

	cmd = cmd + " " + o.Command.String()

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

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

func (o *DmSysbenchOption) GetTableNames() []string {
	var tableNames []string
	// for sysbench, table name have the format `sbtest%d`, start from 1.
	for i := 1; i <= o.TableCount; i++ {
		tableNames = append(tableNames, "sbtest"+strconv.Itoa(i))
	}
	return tableNames
}
