using JT808.Gateway.Client;
using JT808.Protocol;
using JT808.Protocol.Enums;
using JT808.Protocol.Extensions;
using JT808.Protocol.MessageBody;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace JT808.Gateway.NBIotSimpleClient.Services
{
    /// <summary>
    /// 处理平台下发的数据包
    /// </summary>
    public class ProccessPackageService : IHostedService
    {
        ReceviePackageService ReceviePackageService;
        IJT808TcpClientFactory TcpClientFactory;
        JT808Serializer Serializer;
        DeviceInfoService DeviceInfoService;
        ILogger Logger;
        public ProccessPackageService(
            ILoggerFactory loggerFactory,
            IJT808Config jT808Config,
            IJT808TcpClientFactory tcpClientFactory,
            DeviceInfoService deviceInfoService,
            ReceviePackageService receviePackageService)
        {
            ReceviePackageService = receviePackageService;
            TcpClientFactory = tcpClientFactory;
            Serializer = jT808Config.GetSerializer();
            DeviceInfoService = deviceInfoService;
            Logger = loggerFactory.CreateLogger<ProccessPackageService>();
        }

        public Task StartAsync(CancellationToken cancellationToken)
        {
            Task.Run(() =>
            {
                try
                {
                    foreach(var package in ReceviePackageService.BlockingCollection.GetConsumingEnumerable(cancellationToken))
                    {
                        if(package.Header.MsgId == JT808MsgId._0x8100.ToUInt16Value())
                        {
                            if (package.Bodies is JT808_0x8100 body)
                            {
                                DeviceInfoService.DeviceInfos.TryAdd(package.Header.TerminalPhoneNo, new Metadata.DeviceInfo {
                                    TerminalPhoneNo = package.Header.TerminalPhoneNo,
                                    Code = body.Code
                                });
                                Logger.LogInformation($"{package.Header.TerminalPhoneNo}-{body.Code}-success");
                            }
                        }
                        else if (package.Header.MsgId == JT808MsgId._0x8001.ToValue())
                        {
                            if(package.Bodies is  JT808_0x8001 body)
                            {
                                if(body.AckMsgId== JT808MsgId._0x0102.ToUInt16Value()) 
                                { 
                                    if(body.JT808PlatformResult== JT808PlatformResult.succeed)
                                    {
                                        if (DeviceInfoService.DeviceInfos.TryGetValue(package.Header.TerminalPhoneNo, out var deviceInfo))
                                        {
                                            deviceInfo.Successed = true;
                                            DeviceInfoService.DeviceInfos.TryUpdate(package.Header.TerminalPhoneNo, deviceInfo, deviceInfo);
                                        }
                                    }
                                    Logger.LogInformation($"{package.Header.TerminalPhoneNo}-{body.JT808PlatformResult.ToString()}");
                                }
                            }
                        }
                    }
                }
                catch (Exception ex)
                {

                }
            });
            return Task.CompletedTask;
        }

        public Task StopAsync(CancellationToken cancellationToken)
        {
            return Task.CompletedTask;
        }
    }
}