using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Model.ModelVm;
using Model.ModelVm.BllAsnVm;
using Model.ModelVm.PdaVm;
using System;
using System.Security.Claims;
using WMS.IBLL.IPdaServer;

namespace Wms_09.Controllers
{
    [Route("api/[controller]/[action]")]
    [ApiController]
    [Authorize]
    public class PdaAsnController : ControllerBase
    {
        #region 依赖注入
        private readonly IPdaAsnServer _PdaAsnSvc;

        public PdaAsnController(IPdaAsnServer pdaAsnSvc)
        {
            _PdaAsnSvc = pdaAsnSvc;
        }
        #endregion

        #region 公用方法
        /// <summary>
        /// 获取单据列表
        /// </summary>
        /// <param name="model">Type:单据类型</param>
        /// <returns></returns>
        [HttpPost]
        public IActionResult GetArrivalNotices(ArrivalNoticeVm model)
        {
            try
            {
                var models = _PdaAsnSvc.GetArrivalNotices(model);

                return Ok(new { code = 0, msg = "入库单信息", data = models });
            }
            catch (Exception e)
            {
                return Ok(new { code = 1, msg = e.Message });
            }
        }

        /// <summary>
        /// 判断托盘是否可用
        /// </summary>
        /// <param name="model">PalletNo:托盘条码</param>
        /// <returns></returns>
        [HttpPost]
        public IActionResult IsEnablePalletNo(PalletBindVm model)
        {
            try
            {
                var strMsg = _PdaAsnSvc.IsEnablePalletNo(model.PalletNo);

                if (strMsg == "")
                {
                    return Ok(new { code = 0, msg = "托盘可用!" });
                }
                else 
                {
                    return Ok(new { code = 1, msg = strMsg });
                }                
            }
            catch (Exception e)
            {
                return Ok(new { code = 1, msg = e.Message });
            }
        }

        /// <summary>
        /// 获取单据明细列表
        /// </summary>
        /// <param name="model">AsnNo:单据号</param>
        /// <returns></returns>
        [HttpPost]
        public IActionResult GetArrivalNoticeDetails(ArrivalNoticeVm model)
        {
            try
            {
                var models = _PdaAsnSvc.GetArrivalNoticeDetails(model);

                return Ok(new { code = 0, msg = "入库单明细信息", data = models });
            }
            catch (Exception e)
            {
                return Ok(new { code = 1, msg = e.Message });
            }
        }

        /// <summary>
        /// 根据明细ID获取物料详情
        /// </summary>
        /// <param name="model">Id:入库单明细ID</param>
        /// <returns></returns>
        [HttpPost]
        public IActionResult GetArrivalNoticeDetail(ArrivalNoticeDetailVm model)
        {
            try
            {
                var models = _PdaAsnSvc.GetArrivalNoticeDetail(model);

                return Ok(new { code = 0, msg = "入库单明细详细信息", data = models });
            }
            catch (Exception e)
            {
                return Ok(new { code = 1, msg = e.Message });
            }
        }

        /// <summary>
        /// 根据托盘号或箱码获取托盘上箱托信息
        /// </summary>
        /// <param name="model">PalletNo:托盘号 or  BoxNo:箱号</param>
        /// <returns></returns>
        [HttpPost]
        public IActionResult GetBoxInfos(BoxInfoVm model) 
        {
            try
            {
                var models = _PdaAsnSvc.GetBoxInfos(model);

                return Ok(new { code = 0, msg = "托盘上相托信息", data = models });
            }
            catch (Exception e)
            {
                return Ok(new { code = 1, msg = e.Message });
            }
        }

        /// <summary>
        /// 绑定托盘
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        [HttpPost]
        public IActionResult BindPallet(PdaPalletBindVm model) 
        {
            try
            {
                var claimsIdentity = this.User.Identity as ClaimsIdentity;
                if (claimsIdentity == null)
                {
                    throw new Exception("未获取到用户信息");
                }
                string UserId = claimsIdentity.FindFirst(ClaimTypes.Name)?.Value;
                if (string.IsNullOrWhiteSpace(UserId))
                {
                    throw new Exception("未获取到用户信息");
                } 
                _PdaAsnSvc.BindPallet(model, int.Parse(UserId),model.Origin);

                return Ok(new { code = 0, msg = "绑定成功!" });
                
            }
            catch (Exception e)
            {
                return Ok(new { code = 1, msg = e.Message });
            }
        }

        /// <summary>
        /// 删除箱子信息
        /// </summary>
        /// <param name="model">Id:箱子主键</param>
        /// <returns></returns>
        [HttpPost]
        public IActionResult DelBoxInfo(BoxInfoVm model) 
        {
            try
            {
                var claimsIdentity = this.User.Identity as ClaimsIdentity;
                if (claimsIdentity == null)
                {
                    throw new Exception("未获取到用户信息");
                }
                string UserId = claimsIdentity.FindFirst(ClaimTypes.Name)?.Value;
                if (string.IsNullOrWhiteSpace(UserId))
                {
                    throw new Exception("未获取到用户信息");
                }

                model.CreateUser = int.Parse(UserId);

                var strMsg = _PdaAsnSvc.DelBoxInfo(model);

                if (strMsg == "")
                {
                    return Ok(new { code = 0, msg = "删除组托成功!" });
                }
                else
                {
                    return Ok(new { code = 1, msg = strMsg });
                }
            }
            catch (Exception e)
            {
                return Ok(new { code = 1, msg = e.Message });
            }

        }
        #endregion

        #region 生产入库

        #endregion

        #region 空托入库
        /// <summary>
        /// 绑定空托入库信息
        /// </summary>
        /// <param name="model">PalletNo:托盘号 Qty: 数量</param>
        /// <returns></returns>
        [HttpPost]
        public IActionResult BindNullPallet(PalletBindVm model) 
        {
            try
            {
                var claimsIdentity = this.User.Identity as ClaimsIdentity;
                if (claimsIdentity == null)
                {
                    throw new Exception("未获取到用户信息");
                }
                string UserId = claimsIdentity.FindFirst(ClaimTypes.Name)?.Value;
                if (string.IsNullOrWhiteSpace(UserId))
                {
                    throw new Exception("未获取到用户信息");
                }

                model.CreateUser = int.Parse(UserId);

                var strMsg = _PdaAsnSvc.BindNullPallet(model);

                if (strMsg == "")
                {
                    return Ok(new { code = 0, msg = "空托盘组托成功!" });
                }
                else
                {
                    return Ok(new { code = 1, msg = strMsg });
                }
            }
            catch (Exception e)
            {
                return Ok(new { code = 1, msg = e.Message });
            }
        }
        
        /// <summary>
        /// 解绑空托入库信息
        /// </summary>
        /// <param name="model">UpBindPalletNo:解绑托盘号 </param>
        /// <returns></returns>
        [HttpPost]
        public IActionResult UnBindNullPallet(PalletUnBingVm model)
        {
            try
            {
                var claimsIdentity = this.User.Identity as ClaimsIdentity;
                if (claimsIdentity == null)
                {
                    throw new Exception("未获取到用户信息");
                }
                string UserId = claimsIdentity.FindFirst(ClaimTypes.Name)?.Value;
                if (string.IsNullOrWhiteSpace(UserId))
                {
                    throw new Exception("未获取到用户信息");
                }

                model.CreateUser = int.Parse(UserId);

                var strMsg = _PdaAsnSvc.UnBindNullPallet(model.UpbindPalletNo,model.CreateUser);

                if (strMsg == "")
                {
                    return Ok(new { code = 0, msg = "空托盘解绑成功!" });
                }
                else
                {
                    return Ok(new { code = 1, msg = strMsg });
                }
            }
            catch (Exception e)
            {
                return Ok(new { code = 1, msg = e.Message });
            }
        }

        #endregion

        #region 平库入库确认

        /// <summary>
        /// 平库上架确认
        /// </summary>
        /// <param name="model">PalletNo:托盘号 LocatNo: 储位地址</param>
        /// <returns></returns>
        [HttpPost]
        public IActionResult CompleteInStock(PalletBindVm model) 
        {
            try
            {
                var claimsIdentity = this.User.Identity as ClaimsIdentity;
                if (claimsIdentity == null)
                {
                    throw new Exception("未获取到用户信息");
                }
                string UserId = claimsIdentity.FindFirst(ClaimTypes.Name)?.Value;
                if (string.IsNullOrWhiteSpace(UserId))
                {
                    throw new Exception("未获取到用户信息");
                }

                model.CreateUser = int.Parse(UserId);

                var strMsg = _PdaAsnSvc.CompleteInStock(model);

                if (strMsg == "")
                {
                    return Ok(new { code = 0, msg = "上架成功!" });
                }
                else
                {
                    return Ok(new { code = 1, msg = strMsg });
                }
            }
            catch (Exception e)
            {
                return Ok(new { code = 1, msg = e.Message });
            }
        }

        /// <summary>
        /// 根据托盘号获取入库单号
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        [HttpPost]
        public IActionResult GetASNNoByPalletNo(PalletBindVm model)
        {
            try
            {
                var result = _PdaAsnSvc.GetASNNoByPalletNo(model.PalletNo);

                return Ok(new { code = 0, msg = "获取成功!", data = result });
            }
            catch (Exception e)
            {
                return Ok(new { code = 1, msg = e.Message });
            }
        }
        #endregion

        #region 零箱入库
        /// <summary>
        /// 根据箱码获取物料、批次、数量等信息
        /// </summary>
        /// <param name="boxNo">托盘号</param>
        /// <returns></returns>
        [HttpGet]
        public IActionResult GetBoxInfoByBoxNo(string boxNo)
        {
            try
            {
                var list = _PdaAsnSvc.GetBoxInfoByBoxNo(boxNo);
                if (list == null)
                {
                    return Ok(new { data = list, code = 1, msg = "无数据" });
                }
                return Ok(new { data = list, code = 0, msg = "成功" });
            }
            catch (Exception e)
            {
                return Ok(new { data = "", code = 1, msg = $"异常:{e.Message}" });
            }

        }
        /// <summary>
        /// 零箱入库
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        [HttpPost]
        public IActionResult CompleteInStockLing(PdaLingAsnVm model)
        {
            try
            {
                var claimsIdentity = this.User.Identity as ClaimsIdentity;
                if (claimsIdentity == null)
                {
                    throw new Exception("未获取到用户信息");
                }
                string UserId = claimsIdentity.FindFirst(ClaimTypes.Name)?.Value;
                if (string.IsNullOrWhiteSpace(UserId))
                {
                    throw new Exception("未获取到用户信息");
                }
                _PdaAsnSvc.CompleteInStockLing(model, int.Parse(UserId));

                return Ok(new { code = 0, msg = "入库成功!" });

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

        #endregion
    }
}