package cdc

import (
	"fmt"
	l4g "github.com/alecthomas/log4go"
	"github.com/dailymotion/allure-go"
	"github.com/pingcap/log"
	"github.com/stretchr/testify/require"
	"github.com/tidbcloud/qa-PlatformAPIAuto/common"
	"testing"
)

type GCSManagerCommand func() error

func (s *CommonTidbToGCSSceneTest) ExecuteManagerCommandToGCSStep(commandFunc GCSManagerCommand) {
	allure.Step(
		allure.Description("execute manage GCS command step"),
		allure.Action(func() {
			err := commandFunc()
			if err != nil {
				errorMsg := fmt.Errorf("execute manage gcs occur error: %s", err)
				l4g.Error(errorMsg)
				allure.FailNow(errorMsg)
			}
		}),
	)
}

func (s *CommonTidbToGCSSceneTest) InitGCS() error {
	err := common.DeleteBucket(s.DbaasRequestInfo.CommonEnv.GcsUri, s.DbaasRequestInfo.CommonEnv.Ec2Host,
		s.DbaasRequestInfo.CommonEnv.CerPath, s.DbaasRequestInfo.CommonEnv.LoginUser)

	if err != nil {
		l4g.Error("delete bucket failed: %s", s.DbaasRequestInfo.CommonEnv.GcsUri)
		return err
	}

	err = common.CreateBucket(s.DbaasRequestInfo.CommonEnv.GcsUri, s.DbaasRequestInfo.CommonEnv.Ec2Host,
		s.DbaasRequestInfo.CommonEnv.CerPath, s.DbaasRequestInfo.CommonEnv.LoginUser)

	if err != nil {
		l4g.Error("create bucket failed: %s", s.DbaasRequestInfo.CommonEnv.GcsUri)
		return err
	}
	return nil
}

func (s *CommonTidbToGCSSceneTest) CheckGCSBucketSize(t *testing.T) {
	allure.Step(
		allure.Description("check GCS bucket size"),
		allure.Action(func() {
			log.Info("check GCS bucket size")
			size, err := common.GetBucketSize(s.DbaasRequestInfo.CommonEnv.GcsUri, s.DbaasRequestInfo.CommonEnv.Ec2Host,
				s.DbaasRequestInfo.CommonEnv.CerPath, s.DbaasRequestInfo.CommonEnv.LoginUser)
			if err != nil {
				l4g.Info("get gcp bucket size failed:%s", err)
			}
			l4g.Info("get gcp bucket size failed:%s, size:%s", err, size)
			require.NotEqual(t, 0, size)
		}),
	)
}

func (s *CommonTidbToGCSSceneTest) AddBucketRole(t *testing.T) {
	allure.Step(
		allure.Description("add GCS bucket role"),
		allure.Action(func() {
			log.Info("add GCS bucket role")

			//put policy
			err := common.PutGcpBucketPolicy(s.DbaasRequestInfo.CommonEnv.GcsUri, s.AccountId, s.DbaasRequestInfo.CommonEnv.Ec2Host,
				s.DbaasRequestInfo.CommonEnv.CerPath, s.DbaasRequestInfo.CommonEnv.LoginUser)
			if err != nil {
				l4g.Info("get gcp bucket size failed:%s", err)
			}
		}),
	)
}
