using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using StackExchange.Redis;
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Linq;
using System.Data;
using Ropin.Inspection.Service;
using Ropin.Inspection.Repository;
using Ropin.Inspection.Model.Entities;
using Ropin.Inspection.Model;
using Newtonsoft.Json;
using LinqKit;
using Ropin.Inspection.Common.Helper;
using Microsoft.AspNetCore.NodeServices;
using Microsoft.EntityFrameworkCore;
using Ropin.Core.Extensions.Redis;

namespace Ropin.Inspection.Api.Work
{
    public class HostedService : IHostedService, IDisposable
    {
        private readonly ILogger _logger;
        private readonly IServiceProvider _provider;
        private readonly IRedisBasketRepository _redisBasketRepository;
        private readonly IDbContextFactory<InspectionDbContext> _dbContextFactory;
        private readonly Func<InspectionDbContext> _dbFuncContextFactory;
        private readonly INodeServices _nodeServices;
        private readonly IPushMsgService _pushMsgService;
        private readonly ITdevWebScadaDevSpotRepository _devWebScadaDevSpotRepository;
        //private readonly ITdevDevStoreService _devDevStoreService;
        private readonly ITdevDevStoreRepository _tdevDevStoreRepository;
        public HostedService(ILogger<HostedService> logger,
            IServiceProvider provider,
            ITdevDevStoreRepository devDevStoreRepository,
            INodeServices nodeServices,
            Func<InspectionDbContext> dbContextFactory,
            IRedisBasketRepository redisBasketRepository,
            IPushMsgService pushMsgService,
            //IDbContextFactory<InspectionDbContext> dbContextFactory,
            ITdevWebScadaDevSpotRepository devWebScadaDevSpotRepository)
        {
            _logger = logger;
            _provider = provider;
            _tdevDevStoreRepository = devDevStoreRepository;
            _devWebScadaDevSpotRepository = devWebScadaDevSpotRepository;
            _nodeServices = nodeServices;
            // _devDevStoreService = devDevStoreService;
            _redisBasketRepository = redisBasketRepository;
            _dbFuncContextFactory = dbContextFactory;
            _pushMsgService = pushMsgService;
            //var v = _provider.GetRequiredService<IDbContextFactory<InspectionDbContext>>();
            //_dbContextFactory = dbContextFactory;//
        }
        private object _locker = new object();
        public Task StartAsync(CancellationToken cancellationToken)
        {
            Task.Run(async () =>
            {

                while (true)
                {
                    try
                    {
                        string strMsgalarmdic = await _redisBasketRepository.GetValue("fanyibox_msgalarmdic");
                        if (string.IsNullOrWhiteSpace(strMsgalarmdic))
                        {
                            Console.WriteLine("队列中数据不存在!");
                            await _redisBasketRepository.Set("fanyibox_error", "队列中数据不存在!",new TimeSpan(2000000));
                        }
                        else
                        {
                            Dictionary<string, DeviceVlue> msgAlarmDic = JsonConvert.DeserializeObject<Dictionary<string, DeviceVlue>>(strMsgalarmdic);
                            if (msgAlarmDic != null && msgAlarmDic.Count()>0)
                                await SendInterval(msgAlarmDic);
                        }

                        await Task.Delay(100000);
                    }
                    catch (Exception ex)
                    {
                        _logger.LogError(ex.Message);
                        await Task.Delay(1000);
                    }
                }

            });



            return Task.CompletedTask;
        }

        private async Task SendInterval(Dictionary<string, DeviceVlue> msgAlarmDic)
        {
            List<Task> tasks = new List<Task>();
            foreach (var keyValuePair in msgAlarmDic)
            {
                tasks.Add(Task.Run(async () =>
                {
                    await _pushMsgService.PushAlarmMsgAsync(new TpushMsgModel
                    {
                        C_DevStoreCode = keyValuePair.Value.storeCode,
                        C_MsgTypeCode = "MSG_TYPE_001",
                        Msg = "设备点异常" + keyValuePair.Value.name + " boxId:" + keyValuePair.Value.boxId + "  " + keyValuePair.Key,
                        Subject = "运维通知",
                        DevNumber = "boxId:" + keyValuePair.Value.boxId + "  " + keyValuePair.Key,
                        DevName = keyValuePair.Value.name,
                        GenerationType = 2,
                        msgStatus = 0,
                    },"运维通知");



                }));
            }
            FanyiHelper.msgAlarmDic.Clear();
            await _redisBasketRepository.Remove("fanyibox_msgalarmdic");
            //tasks.Add(Task.Run(() =>
            //{

            //})); 
            await Task.WhenAll(tasks);
        }
        public Task StopAsync(CancellationToken cancellationToken)
        {
            Dispose();
            _logger.LogInformation("内部任务计划结束");
            return Task.CompletedTask;
        }

        public void Dispose()
        {
            //t?.Dispose();
        }
    }
}