using Microsoft.Extensions.Logging;
using SlnMesnac.Common;
using SlnMesnac.Model.AirportApiEntity;
using SlnMesnac.Model.domain;
using SlnMesnac.Model.Enum;
using SlnMesnac.Repository.service.@base;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Threading.Tasks;

namespace SlnMesnac.Repository.service.Impl
{
    public class AGVStateServiceImpl : BaseServiceImpl<AGVState>, IAGVStateService
    {
        private ILogger<AGVStateServiceImpl> _logger;
        public AGVStateServiceImpl(Repository<AGVState> repository, ILogger<AGVStateServiceImpl> logger) : base(repository)
        {
            _logger = logger;
        }
        public List<AGVState> GetAgvState(AgvType AgvType)
        {
            string _AgvType = Convert.ToString(((int)AgvType).ToString());
            List<AGVState> agvStateInfoList = null;
            try
            {
                Expression<Func<AGVState, bool>> exp = x => true;
                exp = exp.And(x =>
                (x.agvno != null || x.agvno != "")
                && (x.taskno == null || x.taskno == "")
                && x.agvworkstate == "空闲"
                && (x.agvalarmstate == null || x.agvalarmstate == "")
                && x.agvtype == _AgvType);

                agvStateInfoList = base._rep.GetList(exp);
            }
            catch (Exception ex)
            {
                _logger.LogError($"AGV状态获取错误:{ex.Message}");
            }
            return agvStateInfoList;
        }

        public List<AGVState> GetAllAGVState()
        {
            List<AGVState> agvStateInfoList = null;
            try
            {
                agvStateInfoList = base._rep.GetList();
            }
            catch (Exception ex)
            {
                _logger.LogError($"所有AGV状态获取错误:{ex.Message}");
            }
            return agvStateInfoList;
        }

        public async Task<bool> UpdateAsync(AGVState record)
        {
            bool result = await _rep.UpdateAsync(record);
            return result;
        }

        public async Task<bool> UpdateOrAddByResponse(AGVResponseEntity<List<ResponseRobotAtrributeDataEntity>> response)
        {
            List<AGVState> records = new List<AGVState>();
            foreach (var entity in response.Data)
            {
                AGVState record = new AGVState()
                {
                    agvno = entity.Guid,
                    agvalarmstate = entity.AgvMoveStatus != 6 ? "正常" : "异常",
                    agvtype = entity.Name,
                    agvworkstate = entity.AgvMoveStatus == 1 ? "空闲" : "忙碌",
                    refreshtime = DateTime.Now,
                    taskno = entity.TaskID,
                };
                records.Add(record);
            }

            bool result = false;
            try
            {
                var list = GetAllAGVState();
                foreach (var r in records)
                {
                    if (list.Where(x => x.agvno == r.agvno).Count() == 0)
                    {
                        result = _rep.Insert(r);
                    }
                    else
                    {
                        r.id = list.Where(x => x.agvno == r.agvno).FirstOrDefault().id;
                        result = await _rep.UpdateAsync(r);
                    }
                }
            }
            catch (Exception ex)
            {
                _logger.LogError($"AGV状态更新错误：{ex.Message}");
            }
            return result;
        }
    }
}