namespace RioJoy.Core.Serial;

/// <summary>Tunables for <see cref="RioSerialLink"/>.</summary>
public sealed record RioSerialLinkOptions
{
    /// <summary>
    /// How often to request an analog update while the link runs. The legacy
    /// watch thread polls on a ~55 ms timeout (riovjoy2.cpp#L1069).
    /// </summary>
    public TimeSpan AnalogPollInterval { get; init; } = TimeSpan.FromMilliseconds(55);

    /// <summary>
    /// If no <see cref="Protocol.RioCommand.AnalogReply"/> arrives within this
    /// window, issue a general reset to recover (legacy &gt;5 s rule,
    /// riovjoy2.cpp#L1096).
    /// </summary>
    public TimeSpan AnalogRecoveryTimeout { get; init; } = TimeSpan.FromSeconds(5);

    /// <summary>Whether the link should automatically poll for analog updates.</summary>
    public bool AutoPollAnalog { get; init; } = true;

    /// <summary>
    /// When <see langword="true"/>, a button packet that fails its checksum is
    /// NAK'd (the documented protocol). When <see langword="false"/> (default),
    /// every framed packet is ACK'd regardless of checksum, matching the legacy
    /// receive path which force-accepts (see docs/PROTOCOL.md §2 ⚠️).
    /// </summary>
    public bool VerifyInboundChecksum { get; init; }

    /// <summary>Read buffer size for the receive loop.</summary>
    public int ReadBufferSize { get; init; } = 256;
}
