package user

import (
	"context"

	"hyapp/pkg/xerr"
	userdomain "hyapp/services/user-service/internal/domain/user"
)

const maxAdminProfileBatchSize = 500

// BatchGetUserAdminProfiles 一次读取后台列表所需的 user-service owner 事实。
// 调用方必须按返回 map 的 key 处理缺失用户，不能用请求 ID 构造占位资料。
func (s *Service) BatchGetUserAdminProfiles(ctx context.Context, userIDs []int64) (map[int64]userdomain.AdminProfile, error) {
	if len(userIDs) == 0 {
		return map[int64]userdomain.AdminProfile{}, nil
	}
	if s.userRepository == nil {
		return nil, xerr.New(xerr.Unavailable, "user repository is not configured")
	}

	// 去重既限制 SQL IN 参数数量，也保证同一个用户的角色与封禁事实只聚合一次。
	unique := make([]int64, 0, len(userIDs))
	seen := make(map[int64]struct{}, len(userIDs))
	for _, userID := range userIDs {
		if userID <= 0 {
			return nil, xerr.New(xerr.InvalidArgument, "user_ids contains invalid value")
		}
		if _, exists := seen[userID]; exists {
			continue
		}
		seen[userID] = struct{}{}
		unique = append(unique, userID)
	}
	if len(unique) > maxAdminProfileBatchSize {
		return nil, xerr.New(xerr.InvalidArgument, "user_ids exceeds batch limit")
	}

	return s.userRepository.BatchGetUserAdminProfiles(ctx, unique, s.now().UTC().UnixMilli())
}
