using ServiceCenter.Extensions;
using ServiceCenter.Logs;
using ServiceCenter.Redis;
using ServiceCenter.WebApi;
using WCS.WorkEngineering.WebApi.Models.AGV;
using WCS.WorkEngineering.WebApi.Models.AGV.Request;
using WCS.WorkEngineering.WebApi.Models.AGV.Response;
using WCS.WorkEngineering.WebApi.Models.WCS.Response;
using WCS.WorkEngineering.WebApi.Models.WMS.Response;

namespace WCS.WorkEngineering.WebApi.Controllers
{
    /// <summary>
    ///  AGV接口
    /// </summary>
    public static class AgvApi
    {
        private static string _AgvUrl = null!;

        /// <summary>
        /// AGV地址
        /// </summary>
        public static string AgvUrl
        {
            get
            {
                _AgvUrl ??= RedisHub.Default.Check("AgvUrl")!;
                if (string.IsNullOrEmpty(_AgvUrl))
                {
                    throw new KnownException($"请在Redis配置AgvUrl", LogLevelEnum.High);
                }
                return _AgvUrl;
            }
        }

        #region 任务单生成

        /// <summary>
        ///   测试路径
        /// </summary>
        /// <param name="position">取货机台</param>
        /// <param name="taskCode">WMS任务号</param>
        /// <returns></returns>
        public static GenAgvSchedulingTaskResponse 测试路径(string position, string taskCode)
        {
            return GenAgvSchedulingTask("iwms_third", "", "4", new List<positionCodeClass>()
            {
                new positionCodeClass(){ //取货机台
                    positionCode=position,
                    type="00"
                },
                new positionCodeClass(){ //巷道分配点
                    positionCode="LX002",
                    type="00"
                },
                new positionCodeClass(){ //预分配放货点
                    positionCode="2501",
                    type="00"
                }
            }, "1", taskCode, "LX03", "1");
        }

        /// <summary>
        ///   机台叫料
        /// </summary>
        /// <param name="SPosition">起始点</param>
        /// <param name="EPosition">目标点</param>
        /// <param name="taskCode">WMS任务号</param>
        /// <returns></returns>
        public static GenAgvSchedulingTaskResponse 机台叫料(string SPosition, string EPosition, string taskCode)
        {
            return GenAgvSchedulingTask("iwms_third", "", "4", new List<positionCodeClass>()
            {
                new positionCodeClass(){ //取货机台
                    positionCode=SPosition,
                    type="00"
                },
                new positionCodeClass(){ //巷道分配点
                    positionCode=EPosition,
                    type="00"
                }
            }, "1", taskCode, "ZTGT35", "1");
        }

        /// <summary>
        ///   托盘回库
        /// </summary>
        /// <param name="position">取货机台</param>
        /// <param name="taskCode">WMS任务号</param>
        /// <param name="station">站台</param>
        /// <returns></returns>
        public static GenAgvSchedulingTaskResponse 托盘回库(string position, string taskCode, string station)
        {
            var position1 = "";
            var position2 = "";
            switch (station)
            {
                case "2501": //分拣一北
                    position1 = "LX002";
                    position2 = "2501";
                    break;

                case "2701": //分拣一南
                    position1 = "LX004";
                    position2 = "2701";
                    break;

                case "2901": //分拣二北
                    position1 = "LX006";
                    position2 = "2901";
                    break;

                case "3101": //分拣二南
                    position1 = "LX008";
                    position2 = "3101";
                    break;

                case "3301": //分拣三北
                    position1 = "LX010";
                    position2 = "3301";
                    break;

                case "3501": //分拣三南
                    position1 = "LX012";
                    position2 = "3501";
                    break;
            }

            return GenAgvSchedulingTask("iwms_third", "", "4", new List<positionCodeClass>()
            {
                new positionCodeClass(){ //取货机台
                    positionCode=position,
                    type="00"
                },
                new positionCodeClass(){ //巷道分配点
                    positionCode=position1,
                    type="00"
                },
                new positionCodeClass(){ //预分配放货点
                    positionCode=position2,
                    type="00"
                }
            }, "1", taskCode, "ZTGT31", "1");
        }

        /// <summary>
        ///  Agv任务单生成接口
        /// </summary>
        /// <param name="clienCode">客户端编号</param>
        /// <param name="ctnrCode">容器编号</param>
        /// <param name="ctnrTyp">容器类型</param>
        /// <param name="positionCodePath">路径</param>
        /// <param name="priority">优先级</param>
        /// <param name="taskCode">任务单号</param>
        /// <param name="taskType">任务类型</param>
        /// <param name="hjTaskTy">合金任务模板</param>
        /// <returns></returns>
        /// <exception cref="KnownException"></exception>
        public static GenAgvSchedulingTaskResponse GenAgvSchedulingTask(string clienCode, string ctnrCode, string ctnrTyp, List<positionCodeClass> positionCodePath, string priority, string taskCode, string taskType, string hjTaskTy)
        {
            var res = APICaller.CallApi2<GenAgvSchedulingTaskResponse>(AgvUrl + "/rcms/services/rest/hikRpcService/genAgvSchedulingTask", new GenAgvSchedulingTaskRequest
            {
                clientCode = clienCode,
                ctnrCode = ctnrCode,
                ctnrTyp = ctnrTyp,
                interfaceName = "genAgvSchedulingTask",
                positionCodePath = positionCodePath,
                priority = priority,
                reqCode = Guid.NewGuid().ToString().Replace("-", ""),
                taskCode = taskCode,
                taskTyp = taskType,
                hjTaskTy = hjTaskTy,
                tokenCode = "56898661ea976b748f328cefa6960434",
            });
            if (res.code != AgvResponseCode.Success)
            {
                if (res.message.Contains("未知的呼叫站点"))
                {
                    if (taskType == "ZTGT35")
                    {
                        res.message =   res.message + positionCodePath[1].positionCode;
                    }
                    else if (taskType == "ZTGT31")
                    {
                        res.message = res.message + positionCodePath[0].positionCode;
                    }                
                }
                throw new KnownException($"AGV返回错误:{res.message}", LogLevelEnum.High);
            }
            return res;
        }

        #endregion 任务单生成

        #region 继续执行任务

        /// <summary>
        ///  继续执行任务
        /// </summary>
        /// <param name="taskCode">AGV任务号</param>
        /// <param name="nextPositionCode">下一个地址</param>
        /// <returns>接口返回结果</returns>
        /// <exception cref="KnownException"></exception>
        public static ContinueTaskResponse ContinueTask(string taskCode, string nextPositionCode)
        {
            var res = APICaller.CallApi2<ContinueTaskResponse>(AgvUrl + "/rcms/services/rest/hikRpcService/continueTask", new ContinueTaskRequest
            {
                reqCode = Guid.NewGuid().ToString().Replace("-", ""),
                taskCode = taskCode,
                nextPositionCode = new positionCodeClass()
                {
                    positionCode = nextPositionCode,
                    type = "00"
                }
            });
            if (res.message.Contains("状态出错"))
            {
                res.message = "任务" + taskCode + res.message + "请检查对应是否有误";
            }
            if (res.code != AgvResponseCode.Success)
            {
                throw new KnownException(res.message, LogLevelEnum.High);
            }
            return res;
        }

        #endregion 继续执行任务

        /// <summary>
        /// 取消任务
        /// </summary>
        /// <param name="AGVtaskCode">AGV任务号</param>
        /// <returns></returns>
        /// <exception cref="KnownException"></exception>
        public static CancelTaskResponse CancelAgvTask(string AGVtaskCode)
        {
            var res = APICaller.CallApi2<CancelTaskResponse>(AgvUrl + "/rcms/services/rest/hikRpcService/cancelTask", new CancelTaskRequest
            {
                reqCode = Guid.NewGuid().ToString().Replace("-", ""),
                taskCode = AGVtaskCode,
                forceCancel = "0",
            });
            if (res.code != AgvResponseCode.Success)
            {
                throw new KnownException(res.message, LogLevelEnum.High);
            }
            return res;
        }

        /// <summary>
        ///  AGV取消任务验证
        /// </summary>
        /// <param name="sRes"></param>
        /// <param name="id"></param>
        /// <param name="agvTask">需要取消任务的AGV任务号</param>
        /// <returns></returns>
        public static CancelTaskResponse? CancelAgvTask(SRes<HandleTaskResponse> sRes, int id, string agvTask)
        {
            try
            {
                var res = AgvApi.CancelAgvTask(agvTask);
                return res;
            }
            catch (Exception ex)
            {
                sRes.ResDataList.Add(new HandleTaskResponse()
                {
                    IsSuccess = false,
                    TaskNo = id,
                    Message = $"AGV错误:{ex.Message}",
                });
                return null;
            }
        }
    }
}
