using System.Threading.Channels;
using SHH.Contracts;

namespace SHH.CameraService
{
    /// <summary>
    /// 视频数据内部总线 (线程安全的生产者-消费者通道)
    /// <para>作用：解耦 [采集编码线程] 与 [网络发送线程]</para>
    /// </summary>
    public class VideoDataChannel
    {
        // 限制容量为 100 帧。如果积压超过 100 帧，说明发送端彻底堵死了，必须丢帧。
        private readonly Channel<VideoPayload> _channel;

        public VideoDataChannel(int capacity = 10)
        {
            var options = new BoundedChannelOptions(capacity)
            {
                FullMode = BoundedChannelFullMode.DropOldest, // 核心策略：满了就丢弃最旧的帧
                SingleReader = false, // 允许多个发送 Worker (如 CloudWorker, ScreenWorker) 同时读取
                SingleWriter = true   // 只有一个采集线程在写
            };
            _channel = Channel.CreateBounded<VideoPayload>(options);
        }

        /// <summary>
        /// [生产者] 写入一个封装好的数据包 (非阻塞)
        /// </summary>
        public bool WriteLog(VideoPayload payload) // 改为返回 bool
        {
            // TryWrite 在 DropOldest 模式下虽然几乎总是返回 true，
            // 但如果 Channel 被 Complete (关闭) 了，它会返回 false。
            return _channel.Writer.TryWrite(payload);
        }

        /// <summary>
        /// [消费者] 读取器
        /// </summary>
        public ChannelReader<VideoPayload> Reader => _channel.Reader;
    }
}