package service

import (
	"context"
	"strings"

	admin "google.golang.org/api/admin/directory/v1"

	"github.com/pingcap-inc/it-automation/internal/sync-google-email/store/mysql"
	"github.com/pingcap-inc/it-automation/pkg/log"
)

func (s *sgeService) CheckGoogleUsers(ctx context.Context) {
	log.L(ctx).Info("Start to check google users")

	googleSrv, err := NewGoogleService(ctx)
	if err != nil {
		log.L(ctx).Errorf("Error when calling `NewGoogleService`: %s", err.Error())

		return
	}

	users := []*admin.User{}
	err = googleSrv.Users.List().Customer("my_customer").Pages(
		ctx, func(usersInGWS *admin.Users) error {
			users = append(users, usersInGWS.Users...)
			return nil
		})
	if err != nil {
		log.L(ctx).Errorf("Error when calling `googleSrv.Users.List().Do()`: %s", err.Error())

		return
	}

	mysqlStore, _ := mysql.GetMySQLFactoryOr(nil)

	userInDB, err := mysqlStore.User().ListUsers(ctx)

	if err != nil {
		log.L(ctx).Errorf("Error when calling `mysqlStore.User().ListUsers()`: %s", err.Error())

		return
	}

	for _, user := range userInDB {
		user.GoogleStatus = 0

		// special handle
		if user.Email == "jason.yu@pingcap.com" {
			user.GoogleStatus = 1
		}
	}

	googleUsersMap := make(map[string]*admin.User)
	for _, user := range users {
		googleUsersMap[strings.ToLower(user.PrimaryEmail)] = user
	}

	for _, user := range userInDB {
		if _, ok := googleUsersMap[user.Email]; ok {
			user.GoogleStatus = 1
		}
	}

	// save db
	err = mysqlStore.User().SaveUsers(userInDB)
	if err != nil {
		log.L(ctx).Errorf("Error when calling `mysqlStore.User().SaveUsers()`: %s", err.Error())

		return
	}

	log.L(ctx).Info("Check google users success")
}
