package auth

import (
	"cmp"
	"errors"
	"fmt"
	"slices"
	"strconv"
	"strings"

	"github.com/gin-gonic/gin"
	"github.com/tidbcloud/account/idl/pbgen/proto/account"
)

func GetOrgIDByHeader(ctx *gin.Context) (uint64, error) {
	orgID, err := strconv.ParseUint(ctx.GetHeader(GrpcGatewayOrgIDKey), 10, 64)
	if err != nil {
		return 0, fmt.Errorf("invalid org id: %w", err)
	}
	return orgID, nil
}

func GetProjectIDByHeader(ctx *gin.Context) (uint64, error) {
	projectID, err := strconv.ParseUint(ctx.GetHeader(GrpcGatewayDefaultProjectIDKey), 10, 64)
	if err != nil {
		return 0, fmt.Errorf("invalid project id: %w", err)
	}
	return projectID, nil
}

func getDefaultProjectId(u *User) (uint64, error) {
	// sort by project id
	slices.SortFunc(u.Projects, func(a, b *account.Project) int {
		return cmp.Compare(a.Id, b.Id)
	})
	// return the oldest project id
	for _, p := range u.Projects {
		return p.Id, nil
	}
	return 0, errors.New("default project id is empty")
}

func getProjectIdList(u *User) string {
	ids := make([]string, 0, len(u.Projects))
	for _, p := range u.Projects {
		ids = append(ids, strconv.FormatUint(p.Id, 10))
	}
	return strings.Join(ids, ",")
}
