using Ayay.SerilogLogs;
using Microsoft.Extensions.Hosting;
using Serilog;
using SHH.CameraSdk;

namespace SHH.CameraService;

/// <summary>
/// 图像处理管道配置服务（基于责任链模式）
/// <para>核心职责：</para>
/// <para>1. 组装图像处理集群的执行顺序，形成 "缩放 → 增强" 的固定流程</para>
/// <para>2. 将组装好的管道挂载到全局路由，统一接收驱动层输出的帧数据</para>
/// <para>设计说明：</para>
/// <para>- 采用责任链模式，支持动态扩展处理节点（如后续新增滤镜、裁剪等功能）</para>
/// <para>- 依赖 IHostedService 生命周期，确保在应用启动时完成管道初始化</para>
/// <para>- 与 GlobalPipelineRouter 强关联，是帧数据进入处理流程的唯一入口</para>
public class PipelineConfigurator : IHostedService
{
    #region --- 依赖注入字段 ---

    /// <summary>
    /// 图像缩放集群实例（责任链第一节点）
    /// 功能：根据配置缩放帧分辨率、控制图像放大/缩小开关
    /// </summary>
    private readonly ImageScaleCluster _scale;

    /// <summary>
    /// 图像增强集群实例（责任链第二节点）
    /// 功能：调整图像亮度、对比度等增强效果（基于 ProcessingConfigManager 配置）
    /// </summary>
    private readonly ImageEnhanceCluster _enhance;

    #endregion

    #region --- 构造函数 ---

    /// <summary>
    /// 初始化管道配置服务实例
    /// </summary>
    /// <param name="scale">图像缩放集群（通过 DI 注入，已预设并行度和配置管理器）</param>
    /// <param name="enhance">图像增强集群（通过 DI 注入，已预设并行度和配置管理器）</param>

    public PipelineConfigurator(ImageScaleCluster scale, ImageEnhanceCluster enhance)
    {
        _scale = scale;
        _enhance = enhance;
    }

    #endregion

    #region --- IHostedService 实现 ---

    /// <summary>
    /// 启动服务：组装责任链并挂载到全局路由
    /// <para>执行时机：应用启动时，在所有 Singleton 服务初始化完成后触发</para>
    /// </summary>
    /// <param name="cancellationToken">服务停止令牌（用于响应应用关闭信号）</param>
    /// <returns>异步任务（无返回值）</returns>
    public Task StartAsync(CancellationToken cancellationToken)
    {
        // 1. 建立责任链关系：缩放集群处理完成后，将帧数据传递给增强集群
        // 设计逻辑：Scale 是入口节点，Enhance 是后续节点，可按需求插入更多处理节点
        _scale.SetNext(_enhance);

        // 2. 将责任链入口挂载到全局路由：驱动层输出的所有帧数据都会进入该管道
        // 关键作用：统一帧数据处理入口，屏蔽驱动层与处理层的直接依赖
        GlobalPipelineRouter.SetProcessor(_scale);

        // 启动日志：打印管道组装结果，便于运维排查
        Log.ForContext("SourceContext", LogModules.Core)
            .Information(@"[Pipeline] 图像处理链组装完成: ImageScaleCluster -> ImageEnhanceCluster
    提示：帧数据将按 '缩放 → 增强' 顺序处理，可通过 GlobalPipelineRouter 调整流程");

        return Task.CompletedTask;
    }

    /// <summary>
    /// 停止服务：空实现（无资源需要释放）
    /// <para>说明：图像处理集群的资源释放由各自的 Dispose 方法管理，此处无需额外操作</para>
    /// </summary>
    /// <param name="cancellationToken">服务停止令牌</param>
    /// <returns>空异步任务</returns>
    public Task StopAsync(CancellationToken cancellationToken) => Task.CompletedTask;

    #endregion
}