package google

import (
	"context"
	"fmt"
	"os"
	"testing"

	"github.com/stretchr/testify/assert"
	admin "google.golang.org/api/admin/directory/v1"
)

func TestNewService(t *testing.T) {
	t.Run("Should return a new Service with mocked parameters", func(t *testing.T) {
		ctx := context.TODO()
		userEmail := "liuy@pingcap.com"
		serviceAccountFile := "./service-account.json"
		serviceAccount, err := os.ReadFile(serviceAccountFile)
		scope := []string{admin.AdminDirectoryGroupMemberScope}
		if err != nil {
			t.Fatalf("Error loading golden file: %s", err)
		}

		svc, err := NewAdminSrv(ctx, userEmail, serviceAccount, scope...)
		// do, err := svc.Tables.List("gcp-digital-bi", "gcp-digital-bi.billing.202207_dbaasbilling").Do()
		if err != nil {

		}
		do, err := svc.Members.HasMember("g-pingcap@pingcap.com", "yumin.li@pingcap.com").Do()
		fmt.Println(do.IsMember)
		// fmt.Println(do)
		assert.NoError(t, err)
		assert.NotNil(t, svc)
	})

	t.Run("Should return a new Service with empty service account parameter", func(t *testing.T) {
		ctx := context.TODO()
		userEmail := ""
		scope := ""

		svc, err := NewAdminSrv(ctx, userEmail, nil, scope)
		assert.Error(t, err)
		assert.Nil(t, svc)
	})

	t.Run("Should return an error when scope is nil", func(t *testing.T) {
		ctx := context.TODO()
		userEmail := ""

		svc, err := NewAdminSrv(ctx, userEmail, nil)
		assert.Error(t, err)
		assert.Nil(t, svc)
		assert.ErrorIs(t, err, ErrGoogleClientScopeNil)
	})
}

func TestNewDirectoryService(t *testing.T) {
	t.Run("Should return a new Directory Service Client with mocked parameters", func(t *testing.T) {
		ctx := context.TODO()

		svc := NewAdminServiceFromOauth(ctx)
		// svc, err := NewGroupsSettingService(ctx, userEmail, serviceAccount, scope...)
		do, err := svc.Members.HasMember("g-csg-digital-foundation@pingcap.com", "xiaopeng.zhu@pingcap.com").Do()
		if err != nil {

		}
		fmt.Println(do)

		client, err := NewDirectoryService(svc)
		groups, err := client.ListGroups(ctx, []string{})
		if err != nil {

		}
		fmt.Println(groups)
		assert.NoError(t, err)
		assert.NotNil(t, client)
	})

	t.Run("Should return a new Directory Service Client", func(t *testing.T) {
		svc := &admin.Service{}

		client, err := NewDirectoryService(svc)
		assert.NoError(t, err)
		assert.NotNil(t, client)
	})

}
