using System;
using System.Threading;

namespace NavisworksTransport.Utils
{
    /// <summary>
    /// 自动模式上下文（自动测试 / 批处理执行期间）。
    ///
    /// 自动模式下：
    /// - 窗口（对话框/提示框）自动选择默认动作并立即关闭（或直接跳过弹窗）
    /// - 保证自动测试与批处理流畅进行，无需人工干预
    ///
    /// 进入方式：
    /// - 批处理执行（BatchQueueManager.ProcessQueueAsync）全程
    /// - 测试 HTTP 端点（TestAutomationHttpService 计数器，兼容保留）
    /// - 环境变量 TRANSPORTPLUGIN_TEST_AUTOMATION=1（副实例/测试进程）
    /// </summary>
    public static class AutomationModeContext
    {
        private static int _requestCount;

        /// <summary>
        /// 当前是否处于自动模式（任一来源生效：运行时计数 / 环境变量）。
        /// </summary>
        public static bool IsAutomaticMode =>
            Interlocked.CompareExchange(ref _requestCount, 0, 0) > 0 ||
            DialogHelper.IsTestAutomationModeEnabled;

        /// <summary>
        /// 进入自动模式（可嵌套），Dispose 时退出。
        /// </summary>
        public static IDisposable EnterAutomaticMode()
        {
            Interlocked.Increment(ref _requestCount);
            return new ActionOnDispose(() =>
            {
                if (Interlocked.Decrement(ref _requestCount) < 0)
                {
                    Interlocked.Exchange(ref _requestCount, 0);
                }
            });
        }

        private sealed class ActionOnDispose : IDisposable
        {
            private readonly Action _action;

            public ActionOnDispose(Action action)
            {
                _action = action;
            }

            public void Dispose()
            {
                _action?.Invoke();
            }
        }
    }
}
