package workload

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

type TiupClusterOption struct {
	ClusterName string
	ControlNode string
	Version     *string
	TopoFile    string
	Command     CommandType
}

func (o *TiupClusterOption) Parse(tiupClusterURL *url.URL) *CMD {
	var (
		cmd    = "tiup cluster deploy"
		params []string
	)
	params = append(params, o.ClusterName)
	params = append(params, *o.Version)
	params = append(params, o.TopoFile)
	params = append(params, "-y")

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

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

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

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

type TiupChangefeedOption struct {
	Version      *string
	PDAddr       string
	SinkURI      string
	ChangefeedID string
	Command      CommandType
}

func (o *TiupChangefeedOption) Parse(sinkURL *url.URL) *CMD {
	var (
		cmd    = "tiup "
		params []string
	)

	params = append(params, "ctl:"+*o.Version)
	params = append(params, "cdc changefeed create")
	params = append(params, "--pd=http://"+o.PDAddr)
	params = append(params, "--sink-uri=mysql://root:@"+sinkURL.Hostname()+":"+sinkURL.Port())
	params = append(params, "--changefeed-id="+o.ChangefeedID)
	params = append(params, "--no-confirm")

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

	timeout := time.Minute * 10
	fmt.Print("tiup ctl command is: \n", cmd)
	return NewCMD(cmd, timeout)
}

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

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

type TiupMirrorOption struct {
	MirrorAdress *string
	Command      CommandType
}

func (o *TiupMirrorOption) Parse(sinkURL *url.URL) *CMD {
	var (
		cmd    = "tiup mirror set "
		params []string
	)

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

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

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

type TiupDmOption struct {
	DmName      string
	ControlNode string
	Version     *string
	TopoFile    string
}

func (o *TiupDmOption) Parse(tiupDmURL *url.URL) *CMD {
	var (
		cmd    = "tiup dm deploy"
		params []string
	)
	params = append(params, o.DmName)
	params = append(params, *o.Version)
	params = append(params, o.TopoFile)
	params = append(params, "-y")

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

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

type TiupDmScaleOutOption struct {
	DmName      string
	ControlNode string
	TopoFile    string
}

func (o *TiupDmScaleOutOption) Parse(tiupDmURL *url.URL) *CMD {
	var (
		cmd    = "tiup dm scale-out"
		params []string
	)
	params = append(params, o.DmName)
	params = append(params, o.TopoFile)
	params = append(params, "-y")

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

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

type TiupDmMirrorOption struct {
	MirrorAdress *string
	Command      CommandType
}

func (o *TiupDmMirrorOption) Parse(sinkURL *url.URL) *CMD {
	var (
		cmd    = "tiup mirror set "
		params []string
	)

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

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

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