package authkit

import (
	"context"
	"git.solsynth.dev/hypernet/nexus/pkg/nex"
	"git.solsynth.dev/hypernet/nexus/pkg/nex/sec"
	"git.solsynth.dev/hypernet/nexus/pkg/proto"
	"git.solsynth.dev/hypernet/passport/pkg/authkit/models"
	"github.com/samber/lo"
)

func GetUser(nx *nex.Conn, userId uint) (models.Account, error) {
	conn, err := nx.GetClientGrpcConn(nex.ServiceTypeAuth)
	if err != nil {
		return models.Account{}, err
	}
	raw, _ := proto.NewUserServiceClient(conn).GetUser(context.Background(), &proto.GetUserRequest{
		UserId: lo.ToPtr(uint64(userId)),
	})
	return GetAccountFromUserInfo(&sec.UserInfo{
		ID:        uint(raw.GetId()),
		Name:      raw.GetName(),
		PermNodes: nex.DecodeMap(raw.GetPermNodes()),
		Metadata:  nex.DecodeMap(raw.GetMetadata()),
	}), nil
}

func GetUserByName(nx *nex.Conn, name string) (models.Account, error) {
	conn, err := nx.GetClientGrpcConn(nex.ServiceTypeAuth)
	if err != nil {
		return models.Account{}, err
	}
	raw, _ := proto.NewUserServiceClient(conn).GetUser(context.Background(), &proto.GetUserRequest{
		Name: &name,
	})
	return GetAccountFromUserInfo(&sec.UserInfo{
		ID:        uint(raw.GetId()),
		Name:      raw.GetName(),
		PermNodes: nex.DecodeMap(raw.GetPermNodes()),
		Metadata:  nex.DecodeMap(raw.GetMetadata()),
	}), nil
}

func ListUser(nx *nex.Conn, userId []uint) ([]models.Account, error) {
	conn, err := nx.GetClientGrpcConn(nex.ServiceTypeAuth)
	if err != nil {
		return nil, err
	}
	raw, _ := proto.NewUserServiceClient(conn).ListUser(context.Background(), &proto.ListUserRequest{
		UserId: lo.Map(userId, func(item uint, index int) uint64 {
			return uint64(item)
		}),
	})
	var out []models.Account
	for _, item := range raw.GetData() {
		out = append(out, GetAccountFromUserInfo(&sec.UserInfo{
			ID:        uint(item.GetId()),
			Name:      item.GetName(),
			PermNodes: nex.DecodeMap(item.GetPermNodes()),
			Metadata:  nex.DecodeMap(item.GetMetadata()),
		}))
	}
	return out, nil
}