using Microsoft.Extensions.Logging;
using SlnMesnac.Model.AirportApiEntity;
using SlnMesnac.Repository;
using SlnMesnac.Repository.service;
using SlnMesnac.TouchSocket;
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks;

namespace SlnMesnac.Business.@base
{
    public class BaseStateRefreshBusiness
    {
        private IAGVStateService _AGVStateService;
        private IAGVSettingService _aGVSettingService;
        private ILogger<BaseStateRefreshBusiness> _logger;
        private static BaseStateRefreshBusiness instance;
        private AirPorthttpClient _airPorthttpClient;
        System.Timers.Timer updateTimer;

        public BaseStateRefreshBusiness(ILogger<BaseStateRefreshBusiness> logger, IAGVStateService agvService, AirPorthttpClient airPorthttpClient, IAGVSettingService aGVSettingService)
        {
            _logger = logger;
            _AGVStateService = agvService;
            _airPorthttpClient = airPorthttpClient;
            _aGVSettingService = aGVSettingService;
            updateTimer = new System.Timers.Timer(2000);
            updateTimer.Elapsed += async (sender, e) => await TimerUpadteAGVState();
        }

        public static BaseStateRefreshBusiness GetInstance(ILogger<BaseStateRefreshBusiness> logger, IAGVStateService agvService, AirPorthttpClient airPorthttpClient, IAGVSettingService aGVSettingService)
        {
            if (instance == null)
            {
                instance = new BaseStateRefreshBusiness(logger, agvService, airPorthttpClient, aGVSettingService);
            }
            return instance;
        }

        /// <summary>
        /// AGV状态查询控制
        /// </summary>
        /// <param name="state"></param>
        public void AGVStateUpdateTimerOperation(TimerControl state)
        {
            try
            {
                switch (state)
                {
                    case TimerControl.Start:
                        updateTimer.Start();
                        break;
                    case TimerControl.Stop:
                        updateTimer.Stop();
                        break;
                    case TimerControl.Dispose:
                        updateTimer.Dispose();
                        break;
                    default:
                        _logger.LogError("未知状态");
                        break;
                }
            }
            catch (Exception ex)
            {
                _logger.LogError("AGV状态操作失败!" + ex.Message);
            }
            
        }

        public async Task TimerUpadteAGVState()
        {
            bool result;
            result = await UpdateALLAGVStateByResposne();
            if (!result)
            {
                _logger.LogError("AGV状态更新失败");
            }
        }

        /// <summary>
        /// 调用接口更新所有AGV的状态
        /// </summary>
        /// <returns></returns>
        public async Task<bool> UpdateALLAGVStateByResposne()
        {
            try
            {
                var response = _airPorthttpClient.AGVAllStateRequest();
                if(response == null)
                {
                    return false;
                }

                List<AGVState> records = new List<AGVState>();
                foreach (var entity in response.Data)
                {
                    AGVState record = new AGVState()
                    {
                        agvno = entity.Guid,
                        agvalarmstate = entity.AgvMoveStatus != 6 ? "正常" : "异常",
                        agvtype = _aGVSettingService.GetAgvSettingByID(entity.Guid),
                        agvworkstate = entity.AgvMoveStatus == 1 ? "空闲" : "忙碌",
                        refreshtime = DateTime.Now,
                        taskno = entity.TaskID,
                    };
                    records.Add(record);
                }
                return await _AGVStateService.UpdateOrAddRecords(records);
            }
            catch (Exception e) 
            {
                _logger.LogError("AGV状态更新错误 Error:" + e);
                return false;
            }
        }
    }

    public enum TimerControl
    {
        Start = 1,
        Stop = 2,
        Dispose = 3
    }
}