package workload

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

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

	Command CommandType
}

func (o *SysbenchOption) 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="+"`nslookup "+dbURL.Hostname()+" | awk -F: '{print $2}' | awk 'NR==5' | sed s/[[:space:]]//g` ")
	// 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")

	if o.Command != 0 {
		params = append(params, "--time="+strconv.Itoa(int(o.Duration.Seconds())))
	}

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

	if !o.Debug {
		params = append(params, "--debug=true")
	}

	params = append(params, "--threads="+strconv.Itoa(o.Threads))
	params = append(params, "--mysql-ignore-errors=2013,1213,1105,1205,8022,8027,8028,9004,9007,1062")
	//params = append(params, "--auto-inc=false")

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

	cmd = cmd + " " + o.TestName

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

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

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

func (o *SysbenchOption) 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
}

func (o *SysbenchOption) GetWorkloadParameters(dbURL *url.URL) error {
	PerfWorkloadPara.WorkloadName = "sysbench"
	PerfWorkloadPara.WorkloadType = o.TestName
	PerfWorkloadPara.Threads = o.Threads
	PerfWorkloadPara.TableOrWarehouseCount = o.TableCount
	PerfWorkloadPara.Duration = o.Duration.String()
	PerfWorkloadPara.TestbedName = strings.Split(dbURL.Hostname(), ".")[1]
	PerfWorkloadPara.RunStartTime = time.Now()
	return nil
}