package auth

import (
	"errors"
	"fmt"
	"strconv"

	"braces.dev/errtrace"
	"github.com/gin-gonic/gin"
	"github.com/tidbcloud/account/idl/pbgen/proto/account"
	"github.com/tidbcloud/tiinf/monitor/tilog"
	authsdk "github.com/tidbcloud/tiinf/sdk/auth"

	"github.com/tidbcloud/tidb-management-service/tidb-mgmt-portal/domain/entity"
	"github.com/tidbcloud/tidb-management-service/tidb-mgmt-portal/pkg/consts"
)

// get user info with auth0 token
func (a *authServiceImpl) getCurrentUserByAuth0(
	ctx *gin.Context,
	u *account.GetUserByTokenResponse,
) (*entity.User, error) {
	if u == nil {
		tilog.Error(ctx.Request.Context(), "failed to get auth user")
		return nil, errtrace.Wrap(errors.New("failed to get user"))
	}

	user := &entity.User{
		User:         u.User,
		IdentityType: authsdk.AuthnIdentityTypeUserToken,
	}

	// get org id from query param
	orgId := ctx.Query(consts.OrgIdKey)
	if orgId == "" {
		tilog.Error(ctx.Request.Context(), "failed to get orgId from query param")
		return nil, errtrace.Wrap(errors.New("failed to get orgId from query param"))
	}

	id, err := strconv.ParseUint(orgId, 10, 64)
	if err != nil {
		return nil, errtrace.Wrap(fmt.Errorf("failed to get orgId from query param: %w", err))
	}
	user.Org = &account.Org{
		Id: id,
	}

	// get projectId from query param
	projectId := ctx.Query(consts.ProjectIdKey)
	if projectId != "" {
		id, err := strconv.ParseUint(projectId, 10, 64)
		if err != nil {
			return nil, errtrace.Wrap(fmt.Errorf("failed to get projectId from query param: %w", err))
		}
		user.Projects = []*account.Project{{Status: entity.ProjectStatusActive, Id: id}}
	}
	return user, nil
}
