using System;
using System.Security.Claims;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Options;
using Model.InterFaceModel;
using Model.ModelVm;
using WMS.IBLL.IBllAsnServer;
using WMS.IBLL.IBllCheckServer;
using WMS.IBLL.IBllSoServer;
using WmsApi.Tools;

namespace WmsApi.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 
        public UpApiController(IOptions<ApiUrlConfig> setting,IExportNoticeServer exNoticeSvc,IArrivalNoticeServer arrivalNoticeServer,IStockCheckServer stockCheckSvc)
        {
            _config = setting.Value;
            _exNoticeSvc = exNoticeSvc;
            _arrivalNoticeSvc = arrivalNoticeServer;
            _stockCheckSvc = stockCheckSvc;
        }
        #endregion

        #region 调用上游系统接口

        /// <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 = "未获取到当前操作人信息" });
                }
                var bolls = _arrivalNoticeSvc.CloseArrivalNotice(model.Id, int.Parse(userId));
                 
                if (bolls == "")
                {
                    //系统对接后放开
                    //var bl =_ArrivalNoticeSvc.FinishAsn(model.Id,_config.ErpHost+_config.AsnFinishUrl,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 });
            }
        }

        /// <summary>
        /// 入库单完成回传(批量)
        /// </summary>
        /// <param name="model">入库单号</param>
        /// <returns></returns>
        [HttpPost]
        public IActionResult FinishAsns(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 = "未获取到当前操作人信息" });
                }
                var bolls = _arrivalNoticeSvc.CloseArrivalNotices(model.Ids, int.Parse(userId));

                if (bolls == "")
                {
                    //系统对接后放开
                    //var bl =_ArrivalNoticeSvc.FinishAsn(model.Id,_config.ErpHost+_config.AsnFinishUrl,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 });
            }
        }

        /// <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 = "未获取到当前操作人信息" });
                }
                var bolls = _exNoticeSvc.CloseExportNotice(model.Id, int.Parse(userId));
                if (bolls)
                {
                    //系统对接后放开
                    //var bl =_exNoticeSvc.FinishSo(model.Id,_config.ErpHost + _config.SoFinishUrl, 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 });
            }
        }

        /// <summary>
        /// 完成出库单据 //出库单关闭反馈 批量订单关闭
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        [HttpPost]
        public IActionResult FinishExportNotices(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 = "未获取到当前操作人信息" });
                }
                var bolls = _exNoticeSvc.CloseExportNotices(model.Ids, int.Parse(userId));
                if (bolls)
                {
                    //系统对接后放开
                    //var bl =_exNoticeSvc.FinishSo(model.Id,_config.ErpHost + _config.SoFinishUrl, 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 });
            }
        }

        /// <summary>
        /// 完成盘库单据 //盘库单调整库存反馈
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        [HttpPost]
        public IActionResult FinishCr(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 = "未获取到当前操作人信息" });
                }
                var bolls = _stockCheckSvc.StockAdjust(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 });
            }
        }


        /// <summary>
        /// 作废盘点单
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        [HttpPost]
        public IActionResult ZuofeiCr(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 = "未获取到当前操作人信息" });
                }
                var bolls = _stockCheckSvc.ZuofeiCr(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 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
            { 
                var bl = _exNoticeSvc.ErpAddExportNotice(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 });
            }
        }

        //箱码信息 手持组托用 (赋码或追溯下发到wms)

        //质检结果下发接口 

        //物料信息接口

        //客户信息接口

        //单位信息接口

        //包装信息接口


        #endregion

    }
}