using System;
using System.Collections.Generic;
using System.Security.Claims;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Options;
using Model.ModelDto.DataDto;
using Model.ModelVm;
using Model.ModelVm.BllCheckVm;
using Model.ModelVm.LogVm;
using WMS.Entity.LogEntity;
using WMS.IBLL.IBllCheckServer;
using WMS.IBLL.ILogServer;
using WmsApi.Tools;

namespace WmsApi.Controllers
{
    [Route("api/[controller]/[action]")]
    [ApiController]
    [Authorize]
    public class BllCheckController : ControllerBase
    {
        private readonly ApiUrlConfig _config; //接口交互路径

        private readonly IStockCheckServer _stockCheckSvc;//盘点单Svc 
        private readonly IStockCheckLogServer _stockCheckLogSvc;//盘点记录Svc 

        private readonly ITaskServer _taskSvc;//库内任务Svc 
        private readonly IOperationCRServer _logSvc;//库内操作日志Svc 

        private readonly IWarehouseOutsidePalletsServer _stockPallet; //库外托盘

        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="stockCheckSvc">盘点单Svc</param>
        /// <param name="stockCheckLogSvc">盘点记录Svc</param>
        /// <param name="taskSvc">库内任务Svc</param>
        /// <param name="logSvc">库内操作日志Svc</param>
        /// <param name="stockPallet">库外托盘</param>
        public BllCheckController(IOptions<ApiUrlConfig> setting, IStockCheckServer stockCheckSvc, IStockCheckLogServer stockCheckLogSvc, ITaskServer taskSvc, IOperationCRServer logSvc, IWarehouseOutsidePalletsServer stockPallet)
        {
            _config = setting.Value;
            _stockCheckSvc = stockCheckSvc;
            _stockCheckLogSvc = stockCheckLogSvc;
            _taskSvc = taskSvc;
            _logSvc = logSvc;
            _stockPallet = stockPallet;
        }

        #region 盘点单据

        /// <summary>
        /// 获取盘点单信息
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        [HttpPost]
        public IActionResult GetStockCheckList(GetStockCheckVm model)
        {
            try
            {
                var bolls = _stockCheckSvc.GetStockCheckList(model.CrNo, model.Status, model.PalletNo, model.SkuNo, model.SkuName, model.LotNo, model.StartTime, model.EndTime, model.Page, model.Limit, out int count);

                return Ok(new { code = 0, count, msg = "盘点单信息", data = bolls });
            }
            catch (Exception e)
            {
                return Ok(new { code = 1, msg = e.Message });
            }
        }

        /// <summary>
        /// 获取盘点单明细信息
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        [HttpPost]
        public IActionResult GetStockCheckDetailList(GetStockCheckVm model)
        {
            try
            {
                var bolls = _stockCheckSvc.GetStockCheckDetailList(model.CrNo, model.Page, model.Limit, out int count);

                return Ok(new { code = 0, count, msg = "盘点单明细信息", data = bolls });
            }
            catch (Exception e)
            {
                return Ok(new { code = 1, msg = e.Message });
            }
        }
        /// <summary>
        /// 获取库存明细信息(盘点选择明细数据源)
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        [HttpPost]
        public IActionResult GetCheckStockDetailList(GetStockDetailVm model)
        {
            try
            {
                var bolls = _stockCheckSvc.GetCheckStockDetailList(model.HouseNo, model.RoadwayNo, model.LocateNo, model.SkuNo, model.LotNo, model.Page, model.Limit, out int count);

                return Ok(new { code = 0, count, msg = "获取库存明细信息", data = bolls });
            }
            catch (Exception e)
            {
                return Ok(new { code = 1, msg = e.Message });
            }
        }

        /// <summary>
        /// 获取编辑盘点单据
        /// </summary>
        /// <param name="soNo"></param>
        /// <returns></returns>
        [HttpGet]
        public IActionResult GetStockCheckDetailById(string crNo)
        {
            try
            {
                var bolls = _stockCheckSvc.GetStockCheckDetailById(crNo);

                return Ok(new { code = 0, count = 0, msg = "盘点单编辑信息", data = bolls });
            }
            catch (Exception e)
            {
                return Ok(new { code = 1, msg = e.Message });
            }
        }

        /// <summary>
        /// 添加/编辑盘点单据
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        [HttpPost]
        public IActionResult AddEditStockCheck(AddEditStockCheckVm 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 = "未获取到当前操作人信息" });
                }
                _stockCheckSvc.AddEditStockCheck(model, int.Parse(userId));

                return Ok(new { code = 0, count = 0, msg = "操作成功", data = "" });
            }
            catch (Exception e)
            {
                return Ok(new { code = 1, msg = "操作失败" + e.Message });
            }
        }

        /// <summary>
        /// 删除盘点单据
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        [HttpPost]
        public IActionResult DelStockCheck(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 = "未获取到当前操作人信息" });
                }
                _stockCheckSvc.DelStockCheck(model.Id, int.Parse(userId));

                return Ok(new { code = 0, count = 0, 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 GetStockCheckLogList(GetCheckLogVm model)
        {
            try
            {
                var list = _stockCheckLogSvc.GetStockCheckLogList(model.CrNo, model.Status, model.PalletNo, model.BoxNo, model.SkuNo, model.SkuName, model.LotNo, model.StartTime, model.EndTime, model.Page, model.Limit, out int count);

                return Ok(new { code = 0, count, msg = "盘点记录", data = list });
            }
            catch (Exception e)
            {
                return Ok(new { code = 1, msg = "盘点记录" + e.Message });
            }
        }

        #endregion

        #region 库内任务 及 操作日志

        /// <summary>
        /// 获取库内任务信息
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        [HttpPost]
        public IActionResult GetCrTaskList(GetTaskVm model)
        {
            try
            {
                var type = new List<string>() { "2", "3" };
                var bolls = _taskSvc.GetTaskList(type, model.Type, model.Status, model.TaskNo, model.IsSuccess, model.PalletNo, model.StartTime, model.EndTime, model.Msg, model.Page, model.Limit, out int count);

                return Ok(new { code = 0, count, msg = "库内任务信息", data = bolls });
            }
            catch (Exception e)
            {
                return Ok(new { code = 1, msg = e.Message });
            }
        }

        /// <summary>
        /// 获取库内操作日志信息
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        [HttpPost]
        public IActionResult GetLogOperationCrList(GetOperationVm model)
        {
            try
            {
                var bolls = _logSvc.GetLogOperationCrList(model.MenuName, model.Type, model.Msg, model.StartTime, model.EndTime, model.Page, model.Limit, out int count);

                return Ok(new { code = 0, count, msg = "出库操作日志信息", data = bolls });
            }
            catch (Exception e)
            {
                return Ok(new { code = 1, msg = e.Message });
            }
        }

        /// <summary>
        /// 盘点单出库完成
        /// </summary>
        /// <param name="model">任务信息表</param>
        /// <returns></returns>
        [HttpPost]
        public IActionResult CheckSuccess(LogTask 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 = "未获取到当前操作人信息" });
                }
                _stockCheckSvc.CheckSuccess(model.TaskNo, int.Parse(userId), _config.WcsHost + _config.FinshComApiUrl);

                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 ExportSuccess(LogTask 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 = "未获取到当前操作人信息" });
                }
                _stockCheckSvc.ExportSuccess(model.TaskNo, int.Parse(userId), _config.WcsHost + _config.FinshComApiUrl);

                return Ok(new { code = 0, count = 0, msg = "取消成功" });
            }
            catch (Exception e)
            {
                return Ok(new { code = 1, msg = "取消失败" + e.Message });
            }
        }



        #endregion

        #region 库外托盘

        /// <summary>
        /// 获取库外托盘信息列表
        /// </summary>
        /// <param name="skuNo">物料号</param>
        /// <param name="skuName">物料名称</param>
        /// <param name="lotNo">批次</param>
        /// <param name="palletNo">托盘号</param>
        /// <returns></returns>
        [HttpGet]
        public IActionResult GetPalletsOutside(string skuNo, string skuName, string lotNo, string palletNo)
        {
            List<MateDataStockDto> mateDataStockDtos = _stockPallet.GetPalletsOutside(skuNo, skuName, lotNo, palletNo);
            return Ok(new
            {
                data = mateDataStockDtos,
                code = 0,
                msg = "获取库外托盘信息成功"
            });
        }

        #endregion

    }
}