using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Options;
using Model.InterFaceModel;
using Newtonsoft.Json;
using System;
using System.IO;
using System.Security.Claims;
using Utility.Tools;
using WMS.BLL.LogServer;
using WMS.IBLL.IBllAsnServer;
using WMS.IBLL.IBllCheckServer;
using WMS.IBLL.IBllSoServer;
using WMS.IBLL.ILogServer;
using Wms.Tools;
using WMS.Entity.BllTaskEntity;
using WMS.IBLL.IBllTaskServer;
using Model.ModelVm.BllTaskVm;

namespace Wms.Controllers
{
    /// <summary>
    /// 下游系统交互
    /// </summary>
    [Route("api/[controller]/[action]")]
    [ApiController]
    public class DownApiController : ControllerBase
    {
        private readonly ApiUrlConfig _config; //接口交互路径
        private readonly IExportNoticeServer _exNoticeSvc;//出库单Svc 
        private readonly IPalletBindServer _asnPalletBindSvc;//托盘绑定Svc 
        private readonly IStockCheckServer _crCheckSvc;//托盘绑定Svc 
        private readonly ITaskServer _taskSvc;//任务Svc
        private readonly IBllTaskSyncServer _taskSyncSvc;//任务同步Svc
        private readonly IWaveMageServer _waveSvc;//任务同步Svc
        public DownApiController(IOptions<ApiUrlConfig> setting, IExportNoticeServer exNoticeSvc, IPalletBindServer asnPalletBindSvc, IStockCheckServer crCheckSvc, ITaskServer taskSvc, IBllTaskSyncServer taskSyncSvc, IWaveMageServer waveSvc)
        {
            _config = setting.Value;
            _exNoticeSvc = exNoticeSvc;
            _asnPalletBindSvc = asnPalletBindSvc;
            _crCheckSvc = crCheckSvc;
            _taskSvc = taskSvc;
            _taskSyncSvc = taskSyncSvc;
            _waveSvc = waveSvc;
        }

        #region WMS接口 调用下游系统接口 

        /// <summary>
        /// 指令下发(波次出库)
        /// </summary>
        /// <param name="unstackingMode">拆垛方式</param>
        /// <param name="waveNo">出库单号</param>
        /// <param name="outMode">出库口</param>
        /// <param name="loadingAddre">装车口</param>
        /// <returns></returns>
        [Authorize]
        [HttpGet]
        public IActionResult WaveIssueOutHouse(string waveNo, string unstackingMode, string outMode, string loadingAddre)
        {
            try
            {
                //获取当前登录的用户ID
                var claimsIdentity = this.User.Identity as ClaimsIdentity;
                if (claimsIdentity == null)
                {
                    return Ok(new { code = 1, msg = "未获取到当前操作人信息" });
                }
                var userId = claimsIdentity.FindFirst(ClaimTypes.Name)?.Value;
                if (string.IsNullOrWhiteSpace(userId))
                {
                    return Ok(new { code = 1, msg = "未获取到当前操作人信息" });
                }
                //验证出库口
                //if (string.IsNullOrWhiteSpace(outMode))
                //{
                //    return Ok(new { code = 1, msg = "请选择出库口" });
                //}

                var list = _waveSvc.WaveIssueOutHouse(waveNo, unstackingMode, outMode, loadingAddre, int.Parse(userId), _config.WcsHost + _config.IssueComApiUrl, out string str);

                return Ok(new { code = 0, msg = str, data = list });

            }
            catch (Exception e)
            {
                return Ok(new { code = 1, msg = e.Message });
            }
        }

        /// <summary>
        /// 指令下发(出库)
        /// </summary>
        /// <param name="unstackingMode">拆垛方式</param>
        /// <param name="soNo">出库单号</param>
        /// <param name="outMode">出库口</param>
        /// <param name="loadingAddre">装车口</param>
        /// <returns></returns>
        [Authorize]
        [HttpGet]
        public IActionResult IssueOutHouse(string soNo,string unstackingMode, string outMode,string loadingAddre)
        {
            try
            {
                //获取当前登录的用户ID
                var claimsIdentity = this.User.Identity as ClaimsIdentity;
                if (claimsIdentity == null)
                {
                    return Ok(new { code = 1, msg = "未获取到当前操作人信息" });
                }
                var userId = claimsIdentity.FindFirst(ClaimTypes.Name)?.Value;
                if (string.IsNullOrWhiteSpace(userId))
                {
                    return Ok(new { code = 1, msg = "未获取到当前操作人信息" });
                }
                //验证出库口
                //if (string.IsNullOrWhiteSpace(outMode))
                //{
                //    return Ok(new { code = 1, msg = "请选择出库口" });
                //}

                var list = _exNoticeSvc.IssueOutHouse(soNo,unstackingMode, outMode,loadingAddre, int.Parse(userId), _config.WcsHost + _config.IssueComApiUrl,out string str);
                
                return Ok(new { code = 0, msg = str , data = list }); 
                
            }
            catch (Exception e)
            {
                return Ok(new { code = 1, msg = e.Message });
            }
        }


        /// <summary>
        /// 重新下发出库任务
        /// </summary>
        /// <param name="taskNo"></param>
        /// <returns></returns>
        [HttpGet]
        public IActionResult AgainSendSoTask(string taskNo)
        {
            try
            {
                //获取当前登录的用户ID
                var claimsIdentity = this.User.Identity as ClaimsIdentity;
                if (claimsIdentity == null)
                {
                    return Ok(new { code = 1, msg = "未获取到当前操作人信息" });
                }
                var userId = claimsIdentity.FindFirst(ClaimTypes.Name)?.Value;
                if (string.IsNullOrWhiteSpace(userId))
                {
                    return Ok(new { code = 1, msg = "未获取到当前操作人信息" });
                }
                var list = _exNoticeSvc.AgainSendSoTask(taskNo, int.Parse(userId),_config.WcsHost + _config.IssueComApiUrl2);
               
                return Ok(new { code = 0, msg = "重新下发已完成", data = list });


            }
            catch (Exception e)
            {
                return Ok(new { code = 1, msg = e.Message });
            }
        }

        /// <summary>
        /// 指令下发(盘点出库)
        /// </summary>
        /// <param name="crNo"></param>
        /// <param name="outMode"></param>
        /// <returns></returns>
        [Authorize]
        [HttpGet]
        public IActionResult CheckOutHouse(string crNo,string outMode)
        {
            try
            {
                //获取当前登录的用户ID
                var claimsIdentity = this.User.Identity as ClaimsIdentity;
                if (claimsIdentity == null)
                {
                    return Ok(new { code = 1, msg = "未获取到当前操作人信息" });
                }
                var userId = claimsIdentity.FindFirst(ClaimTypes.Name)?.Value;
                if (string.IsNullOrWhiteSpace(userId))
                {
                    return Ok(new { code = 1, msg = "未获取到当前操作人信息" });
                }

                var list = _crCheckSvc.CheckOutHouse(crNo, outMode,int.Parse(userId), _config.WcsHost + _config.IssueComApiUrl, out string str);

                return Ok(new { code = 0, msg = str, data = list });

            }
            catch (Exception e)
            {
                return Ok(new { code = 1, msg = e.Message });
            }
        }

        /// <summary>
        /// 重新下发盘点任务
        /// </summary>
        /// <param name="taskNo"></param>
        /// <returns></returns>
        [HttpGet]
        public IActionResult AgainSendCheckTask(string taskNo)
        {
            try
            {
                //获取当前登录的用户ID
                var claimsIdentity = this.User.Identity as ClaimsIdentity;
                if (claimsIdentity == null)
                {
                    return Ok(new { code = 1, msg = "未获取到当前操作人信息" });
                }
                var userId = claimsIdentity.FindFirst(ClaimTypes.Name)?.Value;
                if (string.IsNullOrWhiteSpace(userId))
                {
                    return Ok(new { code = 1, msg = "未获取到当前操作人信息" });
                }
                _crCheckSvc.AgainSendCheckTask(taskNo, int.Parse(userId), _config.WcsHost + _config.IssueComApiUrl2);

                return Ok(new { code = 0, msg = "重新下发已完成", data = "" });
            }
            catch (Exception e)
            {
                return Ok(new { code = 1, msg = e.Message });
            }
        }

        #endregion

        #region WMS接口 被下游系统接口调用

        /// <summary>
        /// 绑定信息返回巷道口
        /// </summary>
        /// <param name="model">入库单信息</param>
        /// <returns></returns>
        [AllowAnonymous]
        [HttpPost]
        public IActionResult BindRequestRoadWay(BoxPalletBindVm model)
        {
            var logStr = $@".\log\WCS\WCS托盘绑定-申请巷道" + DateTime.Now.ToString("yyyyMMdd") + ".txt";

            try
            {

                var jsonData = JsonConvert.SerializeObject(model);
                LogFile.SaveLogToFile($"WCS托盘绑定-申请巷道:( {jsonData} ),", logStr);

                 _asnPalletBindSvc.BindPalletStock(model, 0);
                //申请巷道
                var list = _asnPalletBindSvc.RequestRoadWay(model.PalletNo, "W01");
                LogFile.SaveLogToFile($"WCS托盘绑定-申请巷道返回:( {JsonConvert.SerializeObject(list)} ),", logStr);
                
                return Ok(new { Success = 0, Message = "托盘绑定-申请巷道成功", TaskList = list });
            }
            catch (Exception e)
            {
                LogFile.SaveLogToFile($"WCS托盘绑定-申请巷道返回:( {e.Message} ),", logStr);
                
                return Ok(new ErpModel { Success = -1, Message = e.Message });
            }
        }


        /// <summary>
        /// 申请巷道
        /// </summary>
        /// <param name="model">入库单信息</param>
        /// <returns></returns>
        [AllowAnonymous]
        [HttpPost]
        public IActionResult RequestRoadWay(RequestLocate model)
        {
            var logStr = "";
            
            logStr = $@".\log\WCS\WCS申请巷道" + DateTime.Now.ToString("yyyyMMdd") + ".txt";
            
            try
            {
                 
                var jsonData = JsonConvert.SerializeObject(model);
                LogFile.SaveLogToFile($"WCS申请巷道:( {jsonData} ),", logStr);
                
                var list = _asnPalletBindSvc.RequestRoadWay(model.PalletNo, model.HouseNo );

                LogFile.SaveLogToFile($"WCS申请巷道返回:( {JsonConvert.SerializeObject(list)} ),", logStr);
                //new OperationASNServer().AddLogOperationAsn("入库作业", "入库日志", model.PalletNo.Substring(0, 8), 
                //    "申请巷道", $"申请巷道托盘号:{model.PalletNo.Substring(0, 8)}的成功信息", 2);

                return Ok(new { Success = 0, Message = "申请巷道成功", TaskList = list });
            }
            catch (Exception e)
            {
                LogFile.SaveLogToFile($"WCS申请巷道返回:( {e.Message} ),", logStr);
                //new OperationASNServer().AddLogOperationAsn("入库作业", "入库日志", model.PalletNo.Substring(0, 8),
                //"申请巷道", $"申请巷道托盘号:{model.PalletNo.Substring(0, 8)}的失败信息", 2);

                return Ok(new ErpModel { Success = -1, Message = e.Message });
            }
        }

        /// <summary>
        /// 申请储位
        /// </summary>
        /// <param name="model">入库单信息</param>
        /// <returns></returns>
        [AllowAnonymous]
        [HttpPost]
        public IActionResult RequestLocation(RequestLocate model)
        {

            //获取当前登录的用户ID
            //var claimsIdentity = this.User.Identity as ClaimsIdentity;
            //if (claimsIdentity == null)
            //{
            //    return Ok(new { code = 1, msg = "未获取到当前操作人信息" });
            //}
            //var userId = claimsIdentity.FindFirst(ClaimTypes.Name)?.Value;
            //if (string.IsNullOrWhiteSpace(userId))
            //{
            //    return Ok(new { code = 1, msg = "未获取到当前操作人信息" });
            //}

            //string palletno = model.PalletNo;
            var logStr = "";
            if (model.PalletNo.Length == 9)
            {
                logStr = $@".\log\WCS\WMS申请储位" + DateTime.Now.ToString("yyyyMMdd") + ".txt";
            }
            else if (model.PalletNo.Length == 8)
            {
                logStr = $@".\log\WCS\WCS申请储位" + DateTime.Now.ToString("yyyyMMdd") + ".txt";
            }
            
            try
            {
                if (model.PalletNo.Length == 9)
                {
                    var jsonData = JsonConvert.SerializeObject(model);
                    LogFile.SaveLogToFile($"WMS申请储位:( {jsonData} ),", logStr);
                }
                else if (model.PalletNo.Length == 8)
                {
                    var jsonData = JsonConvert.SerializeObject(model);
                    LogFile.SaveLogToFile($"WCS申请储位:( {jsonData} ),", logStr);
                }

                string pallet = model.PalletNo.Substring(0, 8);
                var list = _asnPalletBindSvc.RequestLocation(pallet, model.HouseNo,model.RoadwayNo);

                if (model.PalletNo.Length == 9)
                {
                    new OperationASNServer().AddLogOperationAsn("入库作业", "入库日志", model.PalletNo.Substring(0, 8), "申请储位", $"申请储位托盘号:{model.PalletNo.Substring(0, 8)}的成功信息",2);// int.Parse(userId)
                    LogFile.SaveLogToFile($"WMS申请储位成功:( {JsonConvert.SerializeObject(list)} ),", logStr);
                }
                else if (model.PalletNo.Length == 8)
                {
                    LogFile.SaveLogToFile($"WCS申请储位返回:( {JsonConvert.SerializeObject(list)} ),", logStr);
                }
                if (model.PalletNo.Length == 9)
                {
                   
                }

                return Ok(new { Success = 0, Message = "申请储位成功", TaskList = list });
            }
            catch (Exception e)
            {
                if (model.PalletNo.Length == 9)
                {
                    new OperationASNServer().AddLogOperationAsn("入库作业", "入库日志", model.PalletNo.Substring(0, 8), "申请储位", $"申请储位托盘号:{model.PalletNo.Substring(0,8)}的失败信息", 2);//int.Parse(userId)
                    LogFile.SaveLogToFile($"WMS申请储位失败返回:( {e.Message} ),", logStr);
                }
                else if(model.PalletNo.Length == 8)
                {
                    LogFile.SaveLogToFile($"WCS申请储位返回:( {e.Message} ),", logStr);
                }
                
                return Ok(new ErpModel { Success = -1, Message = e.Message });
            }
        }

        /// <summary>
        /// 接受wcs返回的信号 //指令反馈(是否完成)
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        public IActionResult ReceiveWcsSignal(ReceiveWcsSignal model)
        {
            try
            {
                //记录log
                var logStr = $@".\log\WCS\任务反馈" + DateTime.Now.ToString("yyyyMMdd") + ".txt";
                var jsonData = JsonConvert.SerializeObject(model);
                LogFile.SaveLogToFile($"任务反馈:( {jsonData} ),", logStr);

                if (string.IsNullOrEmpty(model.TaskNo) || string.IsNullOrEmpty(model.TaskStatus) || string.IsNullOrEmpty(model.TaskType))
                {
                    return Ok(new WcsModel { StatusCode = -1, Msg = "接口数据不正确" });
                }
                //接收时间
                var time1 = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
                var orderType = _taskSvc.GetTaskOrderType(model.TaskNo);// 判断单据类型入出移
                switch (orderType)
                {
                    case "0"://入库完成任务
                        if (model.TaskType == "0")//0:入库 1:出库 2:移库
                        {
                            _asnPalletBindSvc.ArrivalSuccess(model.TaskNo,0);
                            return Ok(new WcsModel { StatusCode = 0, Msg = "入库完成" });
                        }
                        break;
                    case "1"://出库完成任务
                        if (model.TaskType == "1")//0:入库 1:出库 2:移库
                        {
                            _exNoticeSvc.ExportSuccess(model.TaskNo,0);
                            return Ok(new WcsModel { StatusCode = 0, Msg = "出库完成" });
                        }
                        else if (model.TaskType == "2")
                        {
                            _exNoticeSvc.RelocationSuccess(model.TaskNo, 0);
                            return Ok(new WcsModel { StatusCode = 0, Msg = "移库完成" });
                        }
                        break;
                    case "2"://盘库完成任务
                        if (model.TaskType == "1")//0:入库 1:出库 3:移库
                        {
                            _crCheckSvc.CheckSuccess(model.TaskNo, 0);
                            return Ok(new WcsModel { StatusCode = 0, Msg = "盘点出库完成" });
                        }
                        else if (model.TaskType == "0")// 盘点出库托盘回库完成
                        {
                            _asnPalletBindSvc.ArrivalSuccess(model.TaskNo, 0);
                            return Ok(new WcsModel { StatusCode = 0, Msg = "入库完成" });
                        }
                        break;
                    case "3"://移库完成任务、优化储位
                        if (model.TaskType == "3") //0:入库 1:出库 3:移库
                        {
                            //填写移库完成代码
                        }
                        break;
                    default :
                        return Ok(new WcsModel { StatusCode = -1, Msg = "传递的任务状态为失败状态" });  
                }
                return Ok(new WcsModel { StatusCode = -1, Msg = "传递的任务状态为失败状态" });
            }
            catch (Exception ex)
            {
                return Ok(new WcsModel { StatusCode = -1, Msg = ex.Message });
            }
        }


        /// <summary>
        /// 空取异常
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        public IActionResult EmptyException(ReceiveWcsSignal model) 
        {
            var logStr = $@".\log\WCS\异常反馈" + DateTime.Now.ToString("yyyyMMdd") + ".txt";
            try
            {
                var jsonData = JsonConvert.SerializeObject(model);
                LogFile.SaveLogToFile($"空取异常:( {jsonData} ),", logStr);

                var bl = _exNoticeSvc.EmptyException(model);

                LogFile.SaveLogToFile($"空取异常:(执行结果成功),", logStr);
                return Ok(new { Success = 0, Message = ""});
            }
            catch (Exception e)
            {
                LogFile.SaveLogToFile($"空取异常:( {e.Message} ),", logStr);
                return Ok(new ErpModel { Success = -1, Message = e.Message });
            }
        }

        /// <summary>
        /// 满入异常
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        public IActionResult FullException(ReceiveWcsSignal model) 
        {
            var logStr = $@".\log\WCS\异常反馈" + DateTime.Now.ToString("yyyyMMdd") + ".txt";
            try
            {
                var jsonData = JsonConvert.SerializeObject(model);
                LogFile.SaveLogToFile($"满入异常:( {jsonData} ),", logStr);

                var list = _asnPalletBindSvc.FullException(model);

                LogFile.SaveLogToFile($"满入异常:( {JsonConvert.SerializeObject(list)} ),", logStr);
                return Ok(new { Success = 0, Message = "", TaskList = list });
            }
            catch (Exception e)
            {
                LogFile.SaveLogToFile($"满入异常:( {e.Message} ),", logStr);
                return Ok(new ErpModel { Success = -1, Message = e.Message });
            }
        }

        //每日清空日志
        [HttpPost]
        public IActionResult DeleteNlogFile()
        {
            try
            {
                string[] files = null;
                try
                {
                    files = Directory.GetFiles(_config.GetLog1);
                }
                catch
                {
                    try
                    {
                        files = Directory.GetFiles(_config.GetLog2);
                    }
                    catch (Exception ex)
                    {
                        throw new Exception(ex.Message);
                    }
                }
                finally
                {
                    foreach (string file in files)
                    {
                        FileInfo fi = new FileInfo(file);
                        if (fi.LastWriteTime < DateTime.Now.AddMonths(-1))
                        {
                            fi.Delete();
                        }
                    }
                }

                return Ok(new
                {
                    msg = "成功清除"
                });
            }
            catch (Exception ex)
            {

                throw new Exception(ex.Message);
            }
        }

        //托盘箱码信息 自动码垛 (wcs提供)

        //申请空托(自动码空托时用)

        //agv返回信息(任务是否完成)
        /// <summary>
        /// 接受agv返回的信号 //指令反馈(是否完成)
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        public IActionResult ReceiveAgvSignal(ReceiveWcsSignal model)
        {
            try
            {
                //记录log
                var logStr = $@".\log\AGV\任务反馈" + DateTime.Now.ToString("yyyyMMdd") + ".txt";
                var jsonData = JsonConvert.SerializeObject(model);
                LogFile.SaveLogToFile($"任务反馈:( {jsonData} ),", logStr);

                if (string.IsNullOrEmpty(model.TaskNo) || string.IsNullOrEmpty(model.TaskStatus) || string.IsNullOrEmpty(model.TaskType))
                {
                    return Ok(new WcsModel { StatusCode = -1, Msg = "接口数据不正确" });
                }
                //接收时间
                var time1 = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
                var orderType = _taskSvc.GetTaskOrderType(model.TaskNo);// 判断单据类型入出移
                switch (orderType)
                {
                   
                    case "1"://出库完成任务
                        if (model.TaskType == "1")//0:入库 1:出库 2:移库
                        {
                            _exNoticeSvc.ExportSuccessAGV(model.TaskNo, 0);
                            return Ok(new WcsModel { StatusCode = 0, Msg = "出库完成" });
                        }
                        else
                        {
                            return Ok(new WcsModel { StatusCode = -1, Msg = "传递的任务类型不是出库类型" });
                        }
                    default:
                        return Ok(new WcsModel { StatusCode = -1, Msg = "传递的任务状态为失败状态" });
                }
            }
            catch (Exception ex)
            {
                return Ok(new WcsModel { StatusCode = -1, Msg = ex.Message });
            }
        }



        /// <summary>
        /// 接收同步任务信息
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        [HttpPost]
        public IActionResult ReceiveWCSTaskSync(TaskSyncInfoVm model)
        {
            try
            {
                //记录log
                var logStr = $@".\log\WCS\任务同步" + DateTime.Now.ToString("yyyyMMdd") + ".txt";
                var jsonData = JsonConvert.SerializeObject(model);
                LogFile.SaveLogToFile($"任务同步:( {jsonData} ),", logStr);

                if (string.IsNullOrEmpty(model.TaskNo) || string.IsNullOrEmpty(model.StartLocat) || string.IsNullOrEmpty(model.EndLocat) || string.IsNullOrEmpty(model.PalletNo))
                {
                    return Ok(new WcsModel { StatusCode = -1, Msg = "接口数据不正确" });
                }
                _taskSyncSvc.ReceiveWCSTaskSync(model);
                return Ok(new WcsModel { StatusCode = 0, Msg = "同步完成" });
            }
            catch (Exception ex)
            {
                return Ok(new WcsModel { StatusCode = -1, Msg = ex.Message });
            }
        }
        #endregion


        #region PDA

        //空托指令下发(出库)


        #endregion

    }
}