Code/Core/Mapping/HandMappingResult.cs
#nullable enable
using HumanoidHandRetargeter.Validation;

namespace HumanoidHandRetargeter.Mapping;

/// <summary>Evidence for a proposed semantic role; unselected candidates remain visible.</summary>
public sealed record HandMappingCandidate(HandSide? Side, string Role, IReadOnlyList<int> Bones,
    float Confidence, string Reason, bool Selected);

public sealed class HandMappingResult
{
    public IReadOnlyList<HandRigDefinition> Hands { get; }
    public IReadOnlyList<HandMappingCandidate> Candidates { get; }
    public IReadOnlyList<RigIssue> Issues { get; }
    public bool NeedsReview { get; }

    internal HandMappingResult(IEnumerable<HandRigDefinition> hands, IEnumerable<HandMappingCandidate> candidates,
        IEnumerable<RigIssue> issues, bool needsReview)
    {
        Hands = Array.AsReadOnly(hands.ToArray());
        Candidates = Array.AsReadOnly(candidates.ToArray());
        Issues = Array.AsReadOnly(issues.ToArray());
        NeedsReview = needsReview || Issues.Count > 0;
    }
}