package contact

import (
	"context"
	"os"
	"testing"

	lark "github.com/larksuite/oapi-sdk-go/v3"
	larkcontact "github.com/larksuite/oapi-sdk-go/v3/service/contact/v3"
	. "github.com/onsi/ginkgo/v2"
	. "github.com/onsi/gomega"
	"github.com/tidbcloud/devops/pkg/infra/utils/test"
)

func TestLarkClientContact(t *testing.T) {
	RegisterFailHandler(Fail)
	RunSpecs(t, "Lark Client Contact")
}

var _ = Describe("[Lark Client Contact]", func() {
	var larkCli *lark.Client

	BeforeEach(func() {
		var err error
		appCode := os.Getenv("LARK_APP_CODE")
		appSecret := os.Getenv("LARK_APP_SECRET")
		larkCli = lark.NewClient(appCode, appSecret)

		Expect(err).To(BeNil())
	})

	Context("Have a Try", func() {
		PIt("List All Department", func() {
			var allDepartments []*larkcontact.Department
			var pageToken *string
			hasMore := true

			for hasMore {
				reqBuilder := larkcontact.NewChildrenDepartmentReqBuilder().
					DepartmentId("0").
					DepartmentIdType("department_id").
					FetchChild(true).
					PageSize(50)

				if pageToken != nil && *pageToken != "" {
					reqBuilder.PageToken(*pageToken)
				}

				resp, err := larkCli.Contact.Department.Children(context.Background(), reqBuilder.Build())
				Expect(err).To(BeNil())
				Expect(resp.Success()).To(BeTrue())

				if resp.Data != nil && resp.Data.Items != nil {
					allDepartments = append(allDepartments, resp.Data.Items...)
				}

				if resp.Data != nil && resp.Data.HasMore != nil && *resp.Data.HasMore {
					hasMore = true
					pageToken = resp.Data.PageToken
				} else {
					hasMore = false
				}
			}

			err := os.WriteFile("departments.json", []byte(test.MarshalIndentOrDie(allDepartments)), 0600)
			Expect(err).To(BeNil())
		})

	})

})
