package oltppkg

import (
	"errors"
	"fmt"
	"strings"

	_ "github.com/go-sql-driver/mysql"
	pdclient "github.com/pingcap/endless/pkg/client/pd"
	"github.com/pingcap/endless/pkg/matcher"
	"github.com/pingcap/log"
	"github.com/pingcap/test-infra/sdk/resource"
)

func ExecTiKVCtlByRemoteMode(tc resource.TiDBCluster, cmd string) (string, error) {
	tikvCtlCmd := fmt.Sprintf("/tikv-ctl %s", cmd)
	stdout, stderr, exitcode, err := tc.Exec(resource.TiDBClusterExecOptions{Target: resource.TiKV, Command: tikvCtlCmd})
	if err != nil {
		fmt.Printf("stderr:%s\n exitCode:%d\n", stderr, exitcode)
		return "", err
	}
	fmt.Printf("%s\n%v\n", tikvCtlCmd, stdout)
	return stdout, nil
}

func ExecTiKVCmd(tc resource.TiDBCluster, peer int, cmd string) (string, error) {
	stdout, stderr, exitcode, err := tc.Exec(resource.TiDBClusterExecOptions{
		Target:  resource.TiKV,
		Command: cmd,
		Peer:    peer,
	})
	if err != nil {
		fmt.Printf("stderr:%s\n exitCode:%d\n", stderr, exitcode)
		return stderr, err
	}
	fmt.Printf("%s\n%v\n", cmd, stdout)
	return stdout, nil
}

// /tikv-ctl --pd http://tc-pd.testbed.svc:2379 compact-cluster
func CompactCluster(tc resource.TiDBCluster) error {
	pdStr := (matcher.Try(pdclient.NewPDClient(tc)).(*pdclient.Client)).GetPDAddr()
	cmd := fmt.Sprintf("--pd %s compact-cluster", pdStr)
	result := matcher.Try(ExecTiKVCtlByRemoteMode(tc, cmd)).(string)
	resultList := strings.Split(result, "\n")
	for _, r := range resultList {
		log.Info(r)
		if !strings.Contains(strings.ToLower(r), "success") {
			return errors.New("compact failed")
		}
	}
	return nil
}
