package decrypt

import (
	"os"
	"testing"

	"github.com/onsi/gomega"

	"github.com/pingcap-inc/clinic/pkg/common"
	"github.com/pingcap-inc/clinic/pkg/config"
	"github.com/pingcap-inc/clinic/pkg/db"
	"github.com/pingcap-inc/clinic/pkg/db/model"
)

func initData(fileUUID string, disableOrgRebuild bool, fileRebuild string) error {
	org, err := model.CreateOrganization(fileUUID, "", 1, func(orgID uint) error {
		return nil
	})
	if err != nil {
		return err
	}
	if err := model.UpdateOrganizationRebuild(org.ID, disableOrgRebuild); err != nil {
		return err
	}

	uf := &db.UploadFile{
		FileUUID:         fileUUID,
		FileOriginalName: "1",
		Alias:            "test",
		StorageType:      string(config.AWSStorageType),
		UploadID:         "Qb9fLCuWNCNsim713mWLmDd0RzpHqImRVqdYYBInvKOv5eyvdY..9iZHraFwcbGFL0Pkbr7cKpzwPKJMVaehP.GJ9WIwXUsOHcxwvJ99VE2jLKGPlLu3T13fJLfGygY5",
		ClusterID:        "Test_NeedToRebuild",
		OrgID:            org.ID,
		Rebuild:          fileRebuild,
	}

	return model.InsertUploadFile(uf)
}

func Test_NeedToRebuild(t *testing.T) {
	fileUUID := "Test_NeedToRebuild"
	g := gomega.NewGomegaWithT(t)

	err := initData(fileUUID, false, "true")
	g.Expect(err).To(gomega.Succeed())

	qf, err := model.QueryUploadFile(fileUUID)
	g.Expect(err).To(gomega.Succeed())

	file, err := os.CreateTemp("", "")
	g.Expect(err).To(gomega.Succeed())
	defer func() {
		if err := file.Close(); err != nil {
			t.Errorf("file close failed, err: %s", err)
		}
	}()

	ok, err := common.NeedToRebuild(qf)
	g.Expect(err).To(gomega.Succeed())
	g.Expect(ok).To(gomega.BeTrue())
}

func Test_DisableRebuild(t *testing.T) {
	fileUUID := "Test_DisableRebuild"
	g := gomega.NewGomegaWithT(t)

	err := initData(fileUUID, false, "false")
	g.Expect(err).To(gomega.Succeed())

	qf, err := model.QueryUploadFile(fileUUID)
	g.Expect(err).To(gomega.Succeed())

	file, err := os.CreateTemp("", "")
	g.Expect(err).To(gomega.Succeed())
	defer func() {
		if err := file.Close(); err != nil {
			t.Errorf("file close failed, err: %s", err)
		}
	}()

	ok, err := common.NeedToRebuild(qf)
	g.Expect(err).To(gomega.Succeed())
	g.Expect(ok).To(gomega.BeFalse())
}

func Test_DisableOrgRebuild(t *testing.T) {
	fileUUID := "Test_DisableOrgRebuild"
	g := gomega.NewGomegaWithT(t)

	err := initData(fileUUID, true, "true")
	g.Expect(err).To(gomega.Succeed())

	qf, err := model.QueryUploadFile(fileUUID)
	g.Expect(err).To(gomega.Succeed())

	file, err := os.CreateTemp("", "")
	g.Expect(err).To(gomega.Succeed())
	defer func() {
		if err := file.Close(); err != nil {
			t.Errorf("file close failed, err: %s", err)
		}
	}()

	ok, err := common.NeedToRebuild(qf)
	g.Expect(err).To(gomega.Succeed())
	g.Expect(ok).To(gomega.BeFalse())
}
