package ccb_application_router

import (
	"fmt"
	"time"

	. "github.com/onsi/gomega"

	"github.com/pingcap/log"
	"github.com/pingcap/test-infra/sdk/resource"
)

func RawKVBackup(stageDesc string, tiupWorkloadNode resource.WorkloadNode, pdAddr string, dstAPIVersion string) (TestCaseStageInfo, string) {
	stage := TestCaseStageInfo{
		Description: stageDesc,
		Start:       time.Now(),
	}
	// TODO: set check-requirements to true OR remove check-requirements=false
	BackupS3Path := fmt.Sprintf("s3://tmp/huayp/rawkv_%s_%v?access-key=minioadmin&secret-access-key=minioadmin&endpoint=http://minio.pingcap.net:9000&force-path-style=true", dstAPIVersion, stage.Start.Unix())
	log.S().Infof("BackupS3Path: %s", BackupS3Path)
	cmd := fmt.Sprintf("tikv-br backup raw --check-requirements=false --checksum --dst-api-version %s"+
		" --log-file \"/tmp/backup.log-%v\" -u %s "+
		"-s \"%s\"",
		dstAPIVersion, stage.Start.Unix(), pdAddr, BackupS3Path)
	log.S().Infof("Backup cmd: %s", cmd)
	options := resource.WorkloadNodeExecOptions{Command: cmd}
	_, _, exitCode, err := tiupWorkloadNode.Exec(options)
	log.S().Infof("Backup end, with err: %v, exitCode: %d", err, exitCode)
	Expect(exitCode).Should(BeEquivalentTo(0))
	Expect(err).Should(BeNil())
	stage.End = time.Now()
	return stage, BackupS3Path
}

func RawKVRestore(stageDesc string, tiupWorkloadNode resource.WorkloadNode, pdAddr string, BackupS3Path string) TestCaseStageInfo {
	stage := TestCaseStageInfo{
		Description: stageDesc,
		Start:       time.Now(),
	}
	// TODO: set check-requirements to true OR remove check-requirements=false
	cmd := fmt.Sprintf("tikv-br restore raw --check-requirements=false --checksum --log-file \"/tmp/restore.log-%v\""+
		" -u %s -s \"%s\"", stage.Start.Unix(), pdAddr, BackupS3Path)
	log.S().Infof("Restore cmd: %s", cmd)
	options := resource.WorkloadNodeExecOptions{Command: cmd}
	_, _, exitCode, err := tiupWorkloadNode.Exec(options)
	log.S().Infof("Restore end, with err: %v, exitCode: %d", err, exitCode)
	Expect(exitCode).Should(BeEquivalentTo(0))
	Expect(err).Should(BeNil())
	stage.End = time.Now()
	return stage
}
