package tenant

import (
	"github.com/pingcap/dbaas/central/db"
	"github.com/pingcap/dbaas/central/db/entity"
	"gorm.io/gorm"
)

type User struct {
	entity.User
	TenantID       entity.ID
	IsImpersonated bool
}

func GetUser(email string) (*User, bool) {
	var dbUser entity.User
	err := db.Transaction(func(tx *gorm.DB) error {
		return entity.NewUserQuerySet(tx.Preload("Roles").Preload("Projects")).EmailEq(email).PreloadTenant().One(&dbUser)
	})
	if err != nil {
		return nil, false
	}

	activeProjects := []entity.Project{}
	for _, p := range dbUser.Projects {
		if p.Status == entity.ProjectStatusActive {
			activeProjects = append(activeProjects, p)
		}
	}
	dbUser.Projects = activeProjects

	return &User{
		User:           dbUser,
		TenantID:       dbUser.TenantID,
		IsImpersonated: false,
	}, true
}

func GetImpersonatedUser(user *User) (*User, bool) {
	var impersonatedUser []entity.ImpersonatedUser
	err := db.Transaction(func(tx *gorm.DB) error {
		return entity.NewImpersonatedUserQuerySet(tx).UserIDEq(user.ID).All(&impersonatedUser)
	})
	if err != nil {
		return user, false
	}
	if len(impersonatedUser) == 0 {
		return user, false
	}
	user.TenantID = impersonatedUser[0].TenantID
	user.IsImpersonated = true
	// Set role to owner, so ImpersonatedUser could view billing page
	user.Role = entity.UserRoleOwner
	return user, true
}
