namespace StellaOps.Vexer.Core;

/// <summary>
/// Policy abstraction supplying trust weights and gating logic for consensus decisions.
/// </summary>
public interface IVexConsensusPolicy
{
    /// <summary>
    /// Semantic version describing the active policy.
    /// </summary>
    string Version { get; }

    /// <summary>
    /// Returns the effective weight (0-1) to apply for the provided VEX source.
    /// </summary>
    double GetProviderWeight(VexProvider provider);

    /// <summary>
    /// Determines whether the claim is eligible to participate in consensus.
    /// </summary>
    /// <param name="claim">Normalized claim to evaluate.</param>
    /// <param name="provider">Provider metadata for the claim.</param>
    /// <param name="rejectionReason">Textual reason when the claim is rejected.</param>
    /// <returns><c>true</c> if the claim should participate; <c>false</c> otherwise.</returns>
    bool IsClaimEligible(VexClaim claim, VexProvider provider, out string? rejectionReason);
}
