using Microsoft.AspNetCore.Mvc;
using System;
using System.Security.Claims;
using Microsoft.Extensions.Options;
using Model;
using Model.ModelVm;
using Newtonsoft.Json;
using Utility.Tools;
using WMS.IBLL.IBllSoServer;
using Wms.Tools;
using Model.InterFaceModel;
using WMS.IBLL.IBllAsnServer;
using WMS.IBLL.IBllCheckServer;
using Model.ModelVm.BllCheckVm;
using WMS.DAL;
using Microsoft.AspNetCore.Authorization;
using WMS.IBLL.IBllTransServer;
using static Model.InterFaceModel.RCSModel;

namespace Wms.Controllers
{
    /// <summary>
    /// 上游系统交互
    /// </summary>
    [Route("api/[controller]/[action]")]
    [ApiController]
    public class UpApiController : ControllerBase
    {
        #region 依赖注入
        private readonly ApiUrlConfig _config; //接口交互路径
        private readonly IExportNoticeServer _exNoticeSvc;//出库单Svc 
        private readonly IArrivalNoticeServer _arrivalNoticeSvc;
        private readonly IStockCheckServer _stockCheckSvc;//盘点单Svc 
        private readonly IProcurePlanServer _procurePlanSvc;//采购单Svs
        private readonly IRcsServer _rcsserver;//RCS相关任务
        private readonly INoticeServer _noticeSvc;//二楼单据相关

        public UpApiController(IOptions<ApiUrlConfig> setting,IExportNoticeServer exNoticeSvc,IArrivalNoticeServer arrivalNoticeServer,IStockCheckServer stockCheckSvc, IProcurePlanServer procurePlanSvc,IRcsServer rcsserver, INoticeServer noticeSvc)
        {
            _config = setting.Value;
            _exNoticeSvc = exNoticeSvc;
            _arrivalNoticeSvc = arrivalNoticeServer;
            _stockCheckSvc = stockCheckSvc;
            _procurePlanSvc = procurePlanSvc;
            _rcsserver = rcsserver;
            _noticeSvc = noticeSvc;
        }
        #endregion

        #region 调用上游系统接口
        /// <summary>
        /// 入库单关闭
        /// </summary>
        /// <param name="model">入库单号</param>
        /// <returns></returns>
        [HttpPost]
        public IActionResult CloseAsn(IdVm model)
        {
            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 = "未获取到当前操作人信息" });
                }
                _arrivalNoticeSvc.CloseArrivalNotice(model.Id, int.Parse(userId));

                return Ok(new { code = 0, count = 0, msg = "入库单关单成功" });
            }
            catch (Exception e)
            {
                return Ok(new { code = 1, msg = e.Message });
            }
        }
        /// <summary>
        /// 入库单复核并回传
        /// </summary>
        /// <param name="model">入库单号</param>
        /// <returns></returns>
        [HttpPost]
        public IActionResult FinishAsn(IdVm model) 
        {
            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 = "未获取到当前操作人信息" });
                }
                _arrivalNoticeSvc.FinishAsn(model.Id, _config.ErpHost + _config.AsnFinishUrl, int.Parse(userId));

                return Ok(new { code = 0, count = 0, msg = "入库单复核并上传成功" });
            }
            catch (Exception e)
            {
                return Ok(new { code = 1, msg = e.Message });
            }
        }

        /// <summary>
        /// Pda复核单据并回传
        /// </summary>
        /// <param name="model">入库单号</param>
        /// <returns></returns>
        [HttpPost]
        public IActionResult ByPdaFinish(IdVm model)
        {
            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 = "未获取到当前操作人信息" });
                }

                _arrivalNoticeSvc.ByPdaFinish(model.Code, model.Code.Substring(0,2) == "AS" ? _config.ErpHost + _config.AsnFinishUrl : _config.ErpHost + _config.SoFinishUrl, int.Parse(userId));

                return Ok(new { code = 0, count = 0, msg = "单据复核并上传成功" });
            }
            catch (Exception e)
            {
                return Ok(new { code = 1, msg = e.Message });
            }
        }

        /// <summary>
        /// 完成/关闭出库单据
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        [HttpPost]
        public IActionResult CloseExportNotice(IdVm model)
        {
            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 = "未获取到当前操作人信息" });
                }
                _exNoticeSvc.CloseExportNotice(model.Id, int.Parse(userId));

                return Ok(new { code = 0, count = 0, msg = "出库单关单成功" });
            }
            catch (Exception e)
            {
                return Ok(new { code = 1, msg = e.Message });
            }
        }
        /// <summary>
        ///  //出库单复核并上传
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        [HttpPost]
        public IActionResult FinishExportNotice(IdVm model)
        {
            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 = "未获取到当前操作人信息" });
                }
                _exNoticeSvc.FinishSo(model.Id, _config.ErpHost + _config.SoFinishUrl, int.Parse(userId));
                return Ok(new { code = 0, count = 0, msg = "出库单复核并上传成功" });
            }
            catch (Exception e)
            {
                return Ok(new { code = 1, msg = e.Message });
            }
        }

        /// <summary>
        /// 完成盘库单据 //盘库单调整库存反馈
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        [HttpPost]
        public IActionResult FinishCr(AdjustStockCheckVm model)
        {
            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 = "未获取到当前操作人信息" });
                }
                bool bolls = false;
                if (model.Origin == "0")
                {
                    bolls = _stockCheckSvc.StockAdjust(model.Id, int.Parse(userId));
                }
                else
                {
                    bolls = _stockCheckSvc.StockAdjustAuto(model.Id, int.Parse(userId));
                }
                if (bolls)
                {
                    //系统对接后放开
                    //var bl =_stockCheckSvc.FinishCr(model.Id,_config.ErpHost + _config.DataChangeUrl, int.Parse(userId));
                    //if (bl)
                    //{
                    return Ok(new { code = 0, count = 0, msg = "盘点单调整上传成功" });
                    //}
                    //return Ok(new { code = 1, count = 0, msg = "出库单关单成功但上传失败" });
                }

                return Ok(new { code = 1, msg = "盘点单调整失败" });

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

        //箱码信息 手持组托用 (扫箱码向追溯要信息)  


        #endregion

        #region 被调上游调用接口

        /// <summary>
        /// 采购单据下发
        /// </summary>
        /// <param name="model">采购单信息</param>
        /// <returns></returns>
        [HttpPost]
        public IActionResult CreateProcurePlan(ProcurePlanInfo model)
        {
            var result = new ErpModel { Success = -1, Message = "" };
            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("未获取到用户信息");
                }*/

                result = _procurePlanSvc.CreateProcurePlan(model);

                return Ok(result);
            }
            catch (Exception e)
            {
                result.Message = e.Message;
                return Ok(result);
            }
        }

        /// <summary>
        /// 入库单据下发
        /// </summary>
        /// <param name="model">入库单信息</param>
        /// <returns></returns>
        [Authorize]
        [HttpPost]
        public IActionResult CreateAsn(AsnInfo model)
        {
            var result = new ErpModel { Success = -1, Message = "" };
            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("未获取到用户信息");
                }

                result = _arrivalNoticeSvc.CreateAsn(model);

                return Ok(result);
            }
            catch (Exception e)
            {
                result.Message = e.Message;
                return Ok(result);
            }
        }

        /// <summary>
        /// 出库单下发接口
        /// </summary>
        /// <param name="model">出库单信息</param>
        /// <returns></returns>
        [HttpPost]
        public IActionResult CreateSo(SoInfo model)
        {
            try
            {
                SoResInfo result = _exNoticeSvc.ErpAddExportNotice(model);
                return Ok(result);
                
            }
            catch (Exception e)
            {
                return Ok(new ErpModel { Success = -1, Message = e.Message });
            }
        }

        /// <summary>
        /// 车间叫料
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        [HttpPost]
        public IActionResult MESProductionCall(ProductionCallVm model)
        {
            try
            {
                var bl = _exNoticeSvc.MESProductionCall(model);
                if (bl)
                {
                    return Ok(new ErpModel { Success = 0, Message = "成功" });
                }
                else
                {
                    return Ok(new ErpModel { Success = -1, Message = "失败" });
                }
            }
            catch (Exception e)
            {
                return Ok(new ErpModel { Success = -1, Message = e.Message });
            }
        }

        /// <summary>
        /// 余料退回入库单据下发
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        [HttpPost]
        public IActionResult CreateAsnYuLiao(AsnYuLiaoModel model)
        {
            var result = new ErpModel { Success = -1, Message = "" };
            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("未获取到用户信息");
                //}

                result = _arrivalNoticeSvc.CreateAsnYuLiao(model);

                return Ok(result);
            }
            catch (Exception e)
            {
                result.Message = e.Message;
                return Ok(result);
            }
        }
        //箱码信息 手持组托用 (赋码或追溯下发到wms)

        //质检结果下发接口 

        //物料信息接口

        //客户信息接口

        //单位信息接口

        //包装信息接口


        #endregion

        #region 测试小数位数值

        //[HttpGet]
        //public IActionResult Demo()
        //{
        //    var result = new ErpModel { Success = -1, Message = "" };
        //    try
        //    {
        //        var com = new Common();
        //        decimal s = 13.3450M;
        //        var sdf = com.GetViewVal(4,s);
        //        result = new ErpModel { Success = -1, Message = sdf.ToString() };

        //        return Ok(result);
        //    }
        //    catch (Exception e)
        //    {
        //        result.Message = e.Message;
        //        return Ok(result);
        //    }
        //}

        #endregion
    }
}