using System;
using System.Collections.Generic;
using System.Security.Claims;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Model.ModelDto.DataDto;
using Model.ModelVm.DataVm;
using WMS.Entity.DataEntity;
using WMS.IBLL.IDataServer;
using WMS.IBLL.ILogServer;

namespace WmsApi.Controllers
{
    [Route("api/[controller]/[action]")]
    [ApiController]
    public class StatisticalController : ControllerBase
    {
        /// <summary>
        /// 依赖注入
        /// </summary>
        private readonly IStockServer _stock; //统计报表
        private readonly IStockDetailServer _stockDetail; //托盘明细
        private readonly IDataBoxInfoServer _dataBoxInfo; //导出
        private readonly IOperationSysServer _operation; //操作日志
        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="stock">统计报表</param>
        public StatisticalController(IStockServer stock, IOperationSysServer operation)
        {
            _stock = stock; //统计报表

            _operation = operation; //操作日志
        }

        #region 库存明细

        /// <summary>
        /// 获取库存总量
        /// </summary>
        /// <param name="skuNo"></param>
        /// <returns></returns>
        [HttpGet]
        public IActionResult GetInventoryList(string skuNo)
        {
            List<MateDataStockDto> StockList = _stock.GetDataStockList(skuNo);
            return Ok(new
            {
                data = StockList,
                code = 0,
                msg = "获取库存总量成功"
            });
        }


        /// <summary>
        /// 获取库存明细
        /// </summary>
        /// <param name="skuNo">物料编码</param>
        /// <param name="lotNo">批次</param>
        /// <param name="type">类型</param>
        /// <param name="locatNo">储位地址</param>
        /// <param name="palletNo">托盘条码</param>
        /// <param name="status">库存状态</param>
        /// <param name="inspectStatus">质检状态</param>
        /// <param name="PalletType">是否字母拖</param>
        /// <param name="IsBale">是否缠膜</param>
        /// <param name="IsBelt">是否打包</param>
        /// <returns></returns>
        [HttpGet]
        public IActionResult GetInventoryList1(string skuNo, string lotNo, string type, string locatNo, string palletNo, string status, string inspectStatus, string PalletType, string IsBale, string IsBelt)
        {
            List<MateDataStockDto> stockDetailsList = _stock.GetInventoryList1(skuNo, lotNo, type, locatNo, palletNo, status, inspectStatus, PalletType, IsBale, IsBelt);
            return Ok(new
            {
                data = stockDetailsList,
                code = 0,
                msg = "获取库存明细成功"
            });
        }

        /// <summary>
        /// 获取库存明细
        /// </summary>
        /// <param name="Id">Id</param>
        /// <returns></returns>
        [HttpGet]
        public IActionResult GetInventoryListById(string Id)
        {
            MateDataStockDto stockDetailsList = _stock.GetInventoryListById(Id);
            return Ok(new
            {
                data = stockDetailsList,
                code = 0,
                msg = "根据ID获取库存明细成功"
            });
        }

        /// <summary>
        /// 增加库存备注
        /// </summary>
        /// <param name="model">库存model</param>
        /// <returns></returns>
        /// <exception cref="System.Exception">捕获异常</exception>
        [HttpPost]
        public async Task<IActionResult> EditDetailDemo(DataStockDetail model)
        {
            //捕获异常
            try
            {
                //获取当前操作用户id
                var claimsIdentity = this.User.Identity as ClaimsIdentity;
                var userId = claimsIdentity.FindFirst(ClaimTypes.Name)?.Value;
                int uid = Convert.ToInt32(userId);
                //更改人
                model.UpdateUser = uid;

                int i = await _stock.EditDetailDemo(model);
                //判断是否编辑成功
                if (i == 0)
                {
                    return Ok(new
                    {
                        data = i,
                        code = 1,
                        msg = "编辑失败"
                    });
                }
                else
                {
                    await _operation.InsertOperation("统计报表", "角色权限", model.PalletNo, "添加", "添加库存备注 托盘号:" + model.PalletNo, uid);
                    return Ok(new
                    {
                        data = i,
                        code = 0,
                        msg = "编辑成功"
                    });
                }
            }
            catch (System.Exception ex)
            {
                //抛出异常
                throw new System.Exception("增加备注异常", ex);
            }
        }

        /// <summary>
        /// 获取库外托盘信息
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        [HttpPost]
        public IActionResult GetOutSideStock(DataVm model)
        {
            try
            {
                var stockDetailsList = _stock.GetOutSideStockList(model.SkuNo, model.SkuName, model.LotNo, model.PalletNo, model.Status, model.Page, model.Limit, out int count);
                return Ok(new { code = 0, count, msg = "获取库存明细成功", data = stockDetailsList });
            }
            catch (Exception e)
            {
                return Ok(new { code = 1, count = 0, msg = e.Message });
            }

        }


        #endregion

        #region 托盘明细

        /// <summary>
        /// 获取托盘明细
        /// </summary>
        /// <param name="skuNo">物料号</param>
        /// <param name="palletNo">托盘号</param>
        /// <param name="lotNo">批次号</param>
        /// <param name="boxNo">箱码</param>
        /// <param name="status">箱支状态</param>
        /// <param name="inspectMark">检验标记</param>
        /// <param name="bitPalletMark">零托标记</param>
        /// <param name="bitBoxMark">零箱标记</param>
        /// <param name="inspectStatus">质量状态</param>
        /// <returns></returns>
        [HttpGet]
        public IActionResult GetBindList(string skuNo, string palletNo, string lotNo, string boxNo, string status, string inspectMark, string bitPalletMark, string bitBoxMark, string inspectStatus)
        {
            List<DataStockDetail> boxInforList = _stock.GetBindList(skuNo, palletNo, lotNo, boxNo, status, inspectMark, bitPalletMark, bitBoxMark, inspectStatus);
            return Ok(new
            {
                data = boxInforList,
                code = 0,
                msg = "获取托盘明细成功"
            });
        }

        /// <summary>
        /// 获取箱码明细
        /// </summary>
        /// <param name="id">id</param>
        /// <param name="skuNo">物料号</param>
        /// <param name="skuName">物料名称</param>
        /// <param name="palletNo">托盘号</param>
        /// <param name="lotNo">批次号</param>
        /// <param name="boxNo">箱码</param>
        /// <param name="status">箱支状态</param>
        /// <param name="inspectMark">检验标记</param>
        /// <param name="bitBoxMark">零箱标记</param>
        /// <param name="inspectStatus">质量状态</param>
        /// <returns></returns>
        [HttpGet]
        public IActionResult GetBoxInfor(string id, string skuNo, string skuName, string palletNo, string lotNo, string boxNo, string status, string inspectMark, string bitBoxMark, string inspectStatus)
        {
            List<DataBoxInfo> boxInfor = _stock.GetBoxInfor(id, skuNo, skuName, palletNo, lotNo, boxNo, status, inspectMark, bitBoxMark, inspectStatus);
            return Ok(new
            {
                data = boxInfor,
                code = 0,
                msg = "获取箱码明细成功"
            });
        }

        /// <summary>
        /// 根据箱码获取箱支信息
        /// </summary>
        /// <param name="boxNo">箱码</param>
        /// <param name="boxNo3">支码</param>
        /// <returns></returns>
        [HttpGet]
        public IActionResult GetBoxInforByBoxNo(string boxNo, string boxNo3)
        {
            List<DataBoxInfo> boxInfor = _stock.GetBoxInforByBoxNo(boxNo, boxNo3);
            return Ok(new
            {
                data = boxInfor,
                code = 0,
                msg = "根据箱码获取箱支信息成功"
            });
        }

        #endregion

        #region 低库存预警

        /// <summary>
        /// 低库存预警
        /// </summary>
        /// <param name="skuNo">物料号</param>
        /// <param name="skuName">物料名称</param>
        /// <param name="lotNo">批次</param>
        /// <param name="type">物料类型</param>
        /// <returns></returns>
        [HttpGet]
        public IActionResult GetInventoryWarning(string skuNo, string skuName, string lotNo, string type)
        {
            List<MateDataStockDto> stockList = _stock.GetInventoryWarning(skuNo, skuName, lotNo, type);
            return Ok(new
            {
                data = stockList,
                code = 0,
                msg = "获取低库存预警成功"
            });
        }

        #endregion

        #region 临期预警

        /// <summary>
        /// 获取临期预警信息
        /// </summary>
        /// <param name="skuNo">物料号</param>
        /// <param name="skuName">物料名称</param>
        /// <param name="lotNo">批次</param>
        /// <param name="palletNo">托盘号</param>
        /// <param name="status">状态</param>
        /// <param name="inspectMark">检验标记</param>
        /// <param name="inspectStatus">质量状态</param>
        /// <param name="isBale">是否裹包</param>
        /// <param name="isBelt">是否打带</param>
        /// <returns></returns>
        [HttpGet]
        public IActionResult GetEmergencyWarning(string skuNo, string skuName, string lotNo, string palletNo, string status, string inspectMark, string inspectStatus, string isBale, string isBelt)
        {
            List<MateDataStockDto> stockList = _stock.GetEmergencyWarning(skuNo, skuName, lotNo, palletNo, status, inspectMark, inspectStatus, isBale, isBelt);
            return Ok(new
            {
                data = stockList,
                code = 0,
                msg = "获取临期预警成功"
            });
        }

        #endregion

        #region 出入库报表

        /// <summary>
        /// 获取出入库总量
        /// </summary>
        /// <param name="skuNo">物料号</param>
        /// <param name="skuName">物料名称</param>
        /// <param name="lotNo">批次</param>
        /// <returns></returns>
        [HttpGet]
        public IActionResult GetTotalRecord(string skuNo, string skuName, string lotNo)
        {
            List<TotalRecordDto> totalsList = _stock.GetTotalRecord(skuNo, skuName, lotNo);
            return Ok(new
            {
                data = totalsList,
                code = 0,
                msg = "获取出入库总量成功"
            });
        }

        /// <summary>
        /// 获取出入库记录
        /// </summary>
        /// <param name="skuNo">物料号</param>
        /// <param name="skuName">物料名称</param>
        /// <param name="lotNo">批次</param>
        /// <param name="palletNo">托盘</param>
        /// <returns></returns>
        [HttpGet]
        public IActionResult GetDetailedRecord(string skuNo, string skuName, string lotNo, string palletNo)
        {
            List<TotalRecordDto> totalsList = _stock.GetDetailedRecord(skuNo, skuName, lotNo, palletNo);
            return Ok(new
            {
                data = totalsList,
                code = 0,
                msg = "获取出入库记录成功"
            });
        }


        #endregion

        #region 周期报表

        #region 周期

        /// <summary>
        /// 周期报表
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        [HttpPost]
        public IActionResult GetToCycleDataStockDetails(DataStockVm model)
        {
            try
            {
                var palletBindList = _stock.GetToCycleDataStockDetails(model.TaskNo, model.DataStatus, model.SkuNo, model.LotNo, model.PalletNo, model.Type, model.Page, model.Limit, out int count);
                return Ok(new { code = 0, count, msg = "获取每日报表明细成功", data = palletBindList });
            }
            catch (Exception e)
            {
                return Ok(new { code = 1, count = 0, msg = e.Message });
            }
        }

        /// <summary>
        /// 周期报表
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        [HttpPost]
        public IActionResult GetDataStockInfo(DataStockVm model)
        {
            try
            {
                var palletBindList = _stock.GetDataStockInfo(model.StartTime, model.EndTime);
                return Ok(new { code = 0, msg = "获取周期报表成功", data = palletBindList });
            }
            catch (Exception e)
            {
                return Ok(new { code = 1, count = 0, msg = e.Message });
            }
        }

        /// <summary>
        /// 获取年报表
        /// </summary>
        /// <param name="StartTime"></param>
        /// <param name="EndTime"></param>
        /// <returns></returns>
        [HttpGet]
        public IActionResult GetAssSoInfo(string StartTime, string EndTime)
        {
            try
            {
                var skulist = _stock.GetAssSoInfo(StartTime, EndTime);
                return Ok(new { code = 0, count = 0, data = skulist, msg = "获取总量成功" });
            }
            catch (Exception ex)
            {

                return Ok(new { code = 1, count = 0, msg = ex.Message });
            }
        }

        /// <summary>
        /// 获取年报表明细
        /// </summary>
        /// <param name="skuNo"></param>
        /// <param name="StartTime"></param>
        /// <param name="EndTime"></param>
        /// <returns></returns>
        [HttpGet]
        public IActionResult GetAssSoInfoDetail(string skuNo, string StartTime, string EndTime)
        {
            try
            {
                var infolist = _stock.GetAssSoInfoDetail(skuNo, StartTime, EndTime);
                return Ok(new { code = 0, count = 0, data = infolist, msg = "获取明细成功" });
            }
            catch (Exception ex)
            {
                return Ok(new { code = 1, count = 0, msg = ex.Message });
            }
        }

        #endregion
        /*
        #region æ—¥

        /// <summary>
        /// 每日报表
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        [HttpPost]
        public IActionResult GetToDayDataStockDetails(DataStockVm model)
        {
            try
            {
                var palletBindList = _stock.GetToDayDataStockDetails(model.SkuNo, model.LotNo, model.PalletNo, model.Type, model.Page, model.Limit, out int count);
                return Ok(new { code = 0, count, msg = "获取每日报表明细成功", data = palletBindList });
            }
            catch (Exception e)
            {
                return Ok(new { code = 1, count = 0, msg = e.Message });
            }
        }

        #endregion

        #region 周

        /// <summary>
        /// 每周报表
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        [HttpPost]
        public IActionResult GetToWeekDataStockDetails(DataStockVm model)
        {
            try
            {
                var palletBindList = _stock.GetToWeekDataStockDetails(model.SkuNo, model.LotNo, model.PalletNo, model.Type, model.Page, model.Limit, out int count);
                return Ok(new { code = 0, count, msg = "获取每周报表明细成功", data = palletBindList });
            }
            catch (Exception e)
            {
                return Ok(new { code = 1, count = 0, msg = e.Message });
            }
        }

        #endregion

        #region 月

        /// <summary>
        /// 每月报表
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        [HttpPost]
        public IActionResult GetToMonthsDataStockDetails(DataStockVm model)
        {
            try
            {
                var palletBindList = _stock.GetToMonthsDataStockDetails(model.SkuNo, model.LotNo, model.PalletNo, model.Type, model.Page, model.Limit, out int count);
                return Ok(new { code = 0, count, msg = "获取每月报表明细成功", data = palletBindList });
            }
            catch (Exception e)
            {
                return Ok(new { code = 1, count = 0, msg = e.Message });
            }
        }

        #endregion

        #region å¹´

        /// <summary>
        /// 每年报表
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        [HttpPost]
        public IActionResult GetToYearDataStockDetails(DataStockVm model)
        {
            try
            {
                var palletBindList = _stock.GetToYearDataStockDetails(model.SkuNo, model.LotNo, model.PalletNo, model.Type, model.Page, model.Limit, out int count);
                return Ok(new { code = 0, count, msg = "获取每年报表明细成功", data = palletBindList });
            }
            catch (Exception e)
            {
                return Ok(new { code = 1, count = 0, msg = e.Message });
            }
        }

        #endregion
        */

        #endregion


        #region 导出

        #region 导出库存信息

        /// <summary>
        /// 导出库存总量
        /// </summary>
        /// <param name="skuNo"></param>
        /// <param name="skuName"></param>
        /// <returns></returns>
        [HttpGet]
        public IActionResult GetInventoryListDaoChu(string skuNo, string skuName)
        {
            List<MateDataStockDto> StockList = _stock.GetDataStockListDaoChu(skuNo, skuName);
            return Ok(new
            {
                data = StockList,
                code = 0,
                msg = "导出库存总量成功"
            });
        }
        /// <summary>
        /// 导出库存明细
        /// </summary>
        /// <param name="skuNo">物料编码</param>
        /// <param name="skuName">物料名称</param>
        /// <param name="lotNo">批次</param>
        /// <param name="locatNo">储位地址</param>
        /// <param name="palletNo">托盘条码</param>
        /// <param name="status">库存状态</param>
        /// <param name="inspectStatus">质检状态</param>
        /// <returns></returns>
        [HttpGet]
        public IActionResult GetInventoryList1DaoChu(string skuNo, string skuName, string lotNo, string locatNo, string palletNo, string status, string inspectStatus)
        {
            List<StockDetailDto> stockDetailsList = _stock.GetInventoryList1DaoChu(skuNo, skuName, lotNo, locatNo, palletNo, status, inspectStatus);
            return Ok(new
            {
                data = stockDetailsList,
                code = 0,
                msg = "导出库存明细成功"
            });
        }

        #endregion

        #region 导出托盘明细

        /// <summary>
        /// 导出托盘明细
        /// </summary>
        /// <param name="skuNo">物料号</param>
        /// <param name="skuName">物料名称</param>
        /// <param name="palletNo">托盘号</param>
        /// <param name="lotNo">批次号</param>
        /// <param name="boxNo">箱码</param>
        /// <param name="status">箱支状态</param>
        /// <param name="inspectMark">检验标记</param>
        /// <param name="bitPalletMark">零托标记</param>
        /// <param name="bitBoxMark">零箱标记</param>
        /// <param name="inspectStatus">质量状态</param>
        /// <returns></returns>
        [HttpGet]
        public IActionResult GetBindListDaoChu(string skuNo, string skuName, string palletNo, string lotNo, string boxNo, string status, string inspectMark, string bitPalletMark, string bitBoxMark, string inspectStatus)
        {
            try
            {
                List<DataStockDetail> boxInfoList = _stockDetail.GetBindListDaoChu(skuNo, skuName, palletNo, lotNo, boxNo, status, inspectMark, bitPalletMark, bitBoxMark, inspectStatus);
                return Ok(new { data = boxInfoList, code = 0, msg = "导出托盘明细成功" });
            }
            catch (Exception e)
            {
                return Ok(new { data = "", code = 0, msg = e.Message });
            }

        }

        #endregion

        #region 导出箱码明细
        /// <summary>
        /// 导出箱码明细
        /// </summary>
        /// <param name="id">id</param>
        /// <param name="skuNo">物料号</param>
        /// <param name="skuName">物料名称</param>
        /// <param name="palletNo">托盘号</param>
        /// <param name="lotNo">批次号</param>
        /// <param name="boxNo">箱码</param>
        /// <param name="status">箱支状态</param>
        /// <param name="inspectMark">检验标记</param>
        /// <param name="bitBoxMark">零箱标记</param>
        /// <param name="inspectStatus">质量状态</param>
        /// <returns></returns>
        [HttpGet]
        public IActionResult GetBoxInfoDaoChu(string id, string skuNo, string skuName, string palletNo, string lotNo, string boxNo, string status, string inspectMark, string bitBoxMark, string inspectStatus)
        {
            try
            {
                List<DataBoxInfo> boxInfo = _dataBoxInfo.GetDataBoxInfoDaoChu(id, skuNo, skuName, palletNo, lotNo, boxNo, status, inspectMark, bitBoxMark, inspectStatus);
                return Ok(new { data = boxInfo, code = 0, msg = "导出箱码明细成功" });
            }
            catch (Exception e)
            {
                return Ok(new { data = "", code = 0, msg = e.Message });
            }

        }
        #endregion

        #region 导出出入库报表

        /// <summary>
        /// 导出出入库总量
        /// </summary>
        /// <param name="skuNo">物料号</param>
        /// <param name="lotNo">批次</param>
        /// <param name="palletNo">托盘号</param>
        /// <returns></returns>
        [HttpGet]
        public IActionResult GetTotalRecordDaoChu(string skuNo, string lotNo, string palletNo)
        {
            List<TotalRecordDto> StockList = _stock.GetTotalRecordDaoChu(skuNo, lotNo, palletNo);
            return Ok(new
            {
                data = StockList,
                code = 0,
                msg = "导出库存总量成功"
            });
        }

        /// <summary>
        /// 导出出入库记录
        /// </summary>
        /// <param name="skuNo">物料编码</param>
        /// <param name="lotNo">批次</param>
        /// <param name="palletNo">托盘号</param>
        /// <returns></returns>
        [HttpGet]
        public IActionResult GetDetailedRecordDaoChu(string skuNo, string lotNo, string palletNo)
        {
            List<TotalRecordDto> stockDetailsList = _stock.GetDetailedRecordDaoChu(skuNo, lotNo, palletNo);
            return Ok(new
            {
                data = stockDetailsList,
                code = 0,
                msg = "导出库存明细成功"
            });
        }

        #endregion

        #endregion
    }
}