package taskboard

import (
	"context"
	"fmt"
	"strings"

	"github.com/tidbcloud/AgentTeam/internal/coredb"
)

func loadTaskPrincipalProfilesByMemberRef(ctx context.Context, queryer coredb.Queryer, refs ...string) (map[string]TaskPrincipalProfile, error) {
	normalized := make([]string, 0, len(refs))
	seen := make(map[string]struct{}, len(refs))
	for _, ref := range refs {
		trimmed := strings.TrimSpace(ref)
		if trimmed == "" {
			continue
		}
		if _, ok := seen[trimmed]; ok {
			continue
		}
		seen[trimmed] = struct{}{}
		normalized = append(normalized, trimmed)
	}
	profiles := make(map[string]TaskPrincipalProfile, len(normalized))
	if len(normalized) == 0 {
		return profiles, nil
	}

	requestedCTE, args, _, err := coredb.BuildStringValuesCTE("requested_members", "member_id", normalized, 1)
	if err != nil {
		return nil, err
	}
	rows, err := queryer.Query(ctx, `WITH `+requestedCTE+`
SELECT
    requested.member_id,
`+taskActorProjectionSelectSQL("member", "user_account", "agent", "service_member", "service_definition")+`
FROM requested_members requested
LEFT JOIN members member
  ON member.id = requested.member_id
`+taskActorProjectionJoinsSQL("member", "user_account", "agent", "service_member", "service_definition")+`
`, args...)
	if err != nil {
		return nil, fmt.Errorf("query task principal profiles: %w", err)
	}
	defer rows.Close()

	for rows.Next() {
		var memberRef string
		var projection taskActorProjection
		scanDest := appendTaskActorProjectionDestinations([]any{&memberRef}, &projection)
		if err := rows.Scan(scanDest...); err != nil {
			return nil, fmt.Errorf("scan task principal profile: %w", err)
		}
		profile, err := taskPrincipalProfileFromProjection("task fact", projection, false)
		if err != nil {
			return nil, err
		}
		if profile != nil {
			profiles[strings.TrimSpace(memberRef)] = *profile
		}
	}
	if err := rows.Err(); err != nil {
		return nil, fmt.Errorf("iterate task principal profiles: %w", err)
	}
	return profiles, nil
}
