using HealthMonitor.Common;
using HealthMonitor.Service.Resolver.Interface;
using HealthMonitor.Service.Sub;
using HealthMonitor.Service.Sub.Interface;
using System.Collections.Concurrent;

namespace HealthMonitor.WebApi
{
    public class PackageProcess : IDisposable
    {
        private readonly ILogger<PackageProcess> _logger;
    
        private readonly MsgQueueManager _msgQueueManager;

        public PackageProcess(ILogger<PackageProcess> logger, MsgQueueManager msgQueueManager)
        {
            _logger = logger;
           
            _msgQueueManager = msgQueueManager;
        }

        public async Task<bool> ResolveAsync()
        {
            _msgQueueManager.TryDequeue(out var msg);
            if (msg == null) return false;
            var resolver = _msgQueueManager.GetMsgResolver(msg!);
            
            using (_logger.BeginScope(new Dictionary<string, object> { ["RequestId"] = msg!.MessageId }))
            using (new CustomizeStopWatch(msg!.Topic, _logger))
            {

                try
                {

                    if (resolver != null)
                    {
                        await resolver.ExecuteMessageAsync().ConfigureAwait(false);
                    }

                }
                catch (Exception ex)
                {
                    _logger.LogError($"未处理异常 message: {ex.Message}\n {ex.StackTrace}");
                }

            }
            return true;

        }

        public void Dispose()
        {
            throw new NotImplementedException();
        }
    }
}