using Quartz;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WIDESEAWCS_Common;
using WIDESEAWCS_Common.TaskEnum;
using WIDESEAWCS_Core.Helper;
using WIDESEAWCS_IBasicInfoRepository;
using WIDESEAWCS_ITaskInfoRepository;
using WIDESEAWCS_ITaskInfoService;
using WIDESEAWCS_Model.Models;
using WIDESEAWCS_QuartzJob;
using WIDESEAWCS_QuartzJob.Service;
using WIDESEAWCS_TaskInfoService;
using WIDESEAWCS_Tasks.HoisterJob;
namespace WIDESEAWCS_Tasks
{
    /// 
    /// 油墨仓提升机
    /// 
    [DisallowConcurrentExecution]
    public class CommonHoisterJob : JobBase, IJob
    {
        private readonly ITaskService _taskService;
        private readonly ITaskExecuteDetailService _taskExecuteDetailService;
        private readonly ITaskRepository _taskRepository;
        private readonly IRouterService _routerService;
        private readonly IStationMangerRepository _stationMangerRepository;
        public CommonHoisterJob(ITaskService taskService, ITaskExecuteDetailService taskExecuteDetailService, ITaskRepository taskRepository, IRouterService routerService, IStationMangerRepository stationMangerRepository)
        {
            _taskService = taskService;
            _taskExecuteDetailService = taskExecuteDetailService;
            _taskRepository = taskRepository;
            _routerService = routerService;
            _stationMangerRepository = stationMangerRepository;
        }
        public Task Execute(IJobExecutionContext context)
        {
            OtherDevice hoister = (OtherDevice)context.JobDetail.JobDataMap.Get("JobParams");
            try
            {
                if (hoister != null)
                {
                    List stationMangers = _stationMangerRepository.QueryData(x => x.StationDeviceCode == hoister.DeviceCode);
                    if (stationMangers == null || stationMangers.Count == 0)
                    {
                        WriteError(hoister.DeviceName, "未找到对应站台信息");
                        return Task.CompletedTask;
                    }
                    foreach (string deviceChildCode in hoister.DeviceProDTOs.GroupBy(x => x.DeviceChildCode).Select(x => x.Key))
                    {
                        bool tray = hoister.GetValue(HoisterDBName.Tray, deviceChildCode);
                        bool leisure = hoister.GetValue(HoisterDBName.Leisure, deviceChildCode);
                        bool requestIn = hoister.GetValue(HoisterDBName.RequestIn, deviceChildCode);
                        bool requestOut = hoister.GetValue(HoisterDBName.RequestOut, deviceChildCode);
                        bool inbounding = hoister.GetValue(HoisterDBName.Inbounding, deviceChildCode);
                        bool outbounding = hoister.GetValue(HoisterDBName.Outbounding, deviceChildCode);
                        if (leisure && tray && !requestIn && !inbounding && !requestOut && !outbounding)
                        {
                            Dt_Task task = _taskRepository.QueryFirst(x => x.TaskState == TaskStatusEnum.New.ObjToInt() && string.IsNullOrEmpty(x.TargetAddress) && x.SourceAddress == deviceChildCode && _taskService.TaskInboundTypes.Contains(x.TaskType));
                            if (task != null)
                            {
                                bool isWrite = hoister.SetValue(HoisterDBName.RequestIn, true, deviceChildCode);
                                WriteError(hoister.DeviceName, $"请求入库,设备编号:{deviceChildCode},任务号:{task.TaskNum}");
                            }
                        }
                        else if (!leisure && tray && requestIn && inbounding && !requestOut && !outbounding)
                        {
                            Dt_Task task = _taskRepository.QueryFirst(x => x.TaskState == TaskStatusEnum.New.ObjToInt() && string.IsNullOrEmpty(x.TargetAddress) && x.SourceAddress == deviceChildCode && _taskService.TaskInboundTypes.Contains(x.TaskType));
                            if (task != null)
                            {
                                Dt_StationManger? stationManger = stationMangers.FirstOrDefault(x => x.StationCode == deviceChildCode);
                                if (stationManger == null)
                                {
                                    WriteError(hoister.DeviceName, $"未找到对应站台信息,设备编号:{deviceChildCode},任务号:{task.TaskNum}");
                                    break;
                                }
                                string? locationCode = _taskService.RequestAssignLocation(task.TaskNum, stationManger.StackerCraneCode);
                                if (string.IsNullOrEmpty(locationCode))
                                {
                                    WriteError(hoister.DeviceName, $"请求分配货位返回信息错误,设备编号:{deviceChildCode},任务号:{task.TaskNum}");
                                    break;
                                }
                                task.CurrentAddress = stationManger.StackerCraneStationCode;
                                task.TargetAddress = locationCode;
                                task.NextAddress = locationCode;
                                task.DeviceCode = stationManger.StackerCraneCode;
                                task.TaskState = TaskStatusEnum.SC_Execute.ObjToInt();
                                bool isWrite = hoister.SetValue(HoisterDBName.RequestIn, false, deviceChildCode);
                                if (isWrite)
                                {
                                    _taskService.UpdateTask(task, TaskStatusEnum.SC_Execute, deviceCode: task.DeviceCode, targetAddress: task.TargetAddress, currentAddress: task.CurrentAddress, nextAddress: task.NextAddress);
                                }
                            }
                            else
                            {
                                WriteError(hoister.DeviceName, $"未找到对应任务信息,{deviceChildCode}");
                            }
                        }
                        else if (leisure && !tray && !requestIn && !inbounding && !requestOut && !outbounding)
                        {
                            Dt_StationManger? stationManger = stationMangers.FirstOrDefault(x => x.StationCode == deviceChildCode);
                            if (stationManger == null)
                            {
                                WriteError(hoister.DeviceName, $"未找到对应站台信息,设备编号:{deviceChildCode}");
                                break;
                            }
                            if (stationManger.StationType != StationTypeEnum.StationType_InboundAndOutbound.ObjToInt())
                            {
                                continue;
                            }
                            Dt_Task task = _taskRepository.QueryFirst(x => x.TaskState == TaskStatusEnum.New.ObjToInt() && string.IsNullOrEmpty(x.TargetAddress) && _taskService.TaskOutboundTypes.Contains(x.TaskType) && x.TaskType != TaskTypeEnum.MesOutbound.ObjToInt() && x.Roadway== stationManger.StackerCraneCode);
                            if (task != null)
                            {
                                task.TaskState=TaskStatusEnum.HT_Executing.ObjToInt();
                                bool isWrite = hoister.SetValue(HoisterDBName.RequestOut, true, deviceChildCode);
                                if (isWrite)
                                {
                                    _taskService.UpdateTask(task, TaskStatusEnum.HT_Executing);
                                }
                                WriteError(hoister.DeviceName, $"请求出库,设备编号:{deviceChildCode},任务号:{task.TaskNum}");
                            }
                        }
                        else if (!leisure && !tray && !requestIn && !inbounding && requestOut && outbounding)
                        {
                            Dt_Task task = _taskRepository.QueryFirst(x => x.TaskState == TaskStatusEnum.HT_Executing.ObjToInt() && string.IsNullOrEmpty(x.TargetAddress) && _taskService.TaskOutboundTypes.Contains(x.TaskType));
                            if (task != null)
                            {
                                Dt_StationManger? stationManger = stationMangers.FirstOrDefault(x => x.StationCode == deviceChildCode);
                                if (stationManger == null)
                                {
                                    WriteError(hoister.DeviceName, $"未找到对应站台信息,设备编号:{deviceChildCode},任务号:{task.TaskNum}");
                                    break;
                                }
                                task.TargetAddress = deviceChildCode;
                                task.NextAddress = stationManger.StackerCraneStationCode; ;
                                task.DeviceCode = stationManger.StackerCraneCode;
                                task.TaskState = TaskStatusEnum.SC_Execute.ObjToInt();
                                bool isWrite = hoister.SetValue(HoisterDBName.RequestOut, false, deviceChildCode);
                                if (isWrite)
                                {
                                    _taskService.UpdateTask(task, TaskStatusEnum.SC_Execute, deviceCode: task.DeviceCode, targetAddress: task.TargetAddress, nextAddress: task.NextAddress);
                                }
                            }
                            else
                            {
                                WriteError(hoister.DeviceName, $"未找到对应站台信息,{deviceChildCode}");
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                WriteError(hoister.DeviceName, "", ex);
            }
            return Task.CompletedTask;
        }
    }
}