using WmsMobileServe.Annotation;
using WmsMobileServe.ApiClient.Mes;
using WmsMobileServe.ApiClient.Mes.Dto;
using WmsMobileServe.ApiServe.Mobile.Dto;
using WmsMobileServe.ApiServe.Mobile.Vo;
using WmsMobileServe.DataBase.Base.Dao;
using WmsMobileServe.DataBase.Base.Po;
using WmsMobileServe.Utils;

namespace WmsMobileServe.ApiServe.Mobile.Service;


[Component]
public class StockInService(MesApiClient mesApiClient, TOnGoodsShelfDao onGoodsShelfDao, TMiStockDao miStockDao, CuxWmsPoLinesItfDao cuxWmsPoLinesItfDao,
    TRKWareNOticeTabDao wareNoticeTabDao)
{
    /// <summary>
    /// 空载具入库
    /// </summary>
    /// <param name="request"></param>
    /// <returns></returns>
    public MobileApiResponse EmptyVehicleIn(EmptyVehicleInReq request)
    {
        if (string.IsNullOrEmpty(request.VehicleNo)) return MobileApiResponse.Fail("传入的载具号为空");
        /* 检验载具是否有入库任务 */
        var stackInRasks = onGoodsShelfDao.SelectWithVehicleNo(request.VehicleNo);
        if(stackInRasks == default) return MobileApiResponse.Fail("数据服务异常，请稍后再试");
        if(stackInRasks.Count > 0) return MobileApiResponse.Fail(string.Format("该载具号：{0} 存在入库任务，请核实后再试", request.VehicleNo));
        /* 检验载具是否在库存中 */
        var stocks = miStockDao.SelectWithVehicleNo(request.VehicleNo);
        if (stocks == default) return MobileApiResponse.Fail("数据服务异常，请稍后再试");
        if (stocks.Count > 0) return MobileApiResponse.Fail(string.Format("该载具号：{0} 仍在库中，请核实后再试", request.VehicleNo));
        /* 构建空载具信息插入数据库 */
        TOnGoodsShelf onGoodsShelf = new()
        {
            LotId = UUIDUtils.GetNewUUID2(),
            GoodsId = "000000",
            ProviderId = "景旺",
            LocationId = "",
            StoNum = 1,
            AccNum = 1,
            ShelfNum = 1,
            StockNum = 0,
            OnDate = DateTime.Now,
            OnShelfUserId = "Mobile_Android",
            StorageId = "-",
            StorageAreaId = "-",
            UpGoodsId = UUIDUtils.GetNewUUID2(),
            GoodsTypeId = "0",
            StorageMode = "空托入库",
            ProdictionDate = DateTime.Now,
            Ctl = request.VehicleNo,
            BarCode = "-",
            CustomerId = "景旺",
            GoodsName = "空载具",
            Status = "0",
            Unit = "-",
            TaskType = "1",
            GoodsMeasureId = UUIDUtils.GetNewUUID2(),
            PackingNum = 1,
            DamageNum = 1,
            Remark = ""
        };
        var insertResult = onGoodsShelfDao.Insert(onGoodsShelf);
        if (insertResult > 0) return MobileApiResponse.Success(string.Format("空载具：{0} 产生入库任务成功", request.VehicleNo));
        return MobileApiResponse.Fail(string.Format("空载具：{0} 产生入库任务失败，数据无法插入", request.VehicleNo));
    }



    /// <summary>
    /// 获取箱子号对应的信息
    /// </summary>
    /// <param name="boxNo"></param>
    /// <returns></returns>
    public MobileApiResponse<GetGoodsDetailResp> GetGoodsDetail(string? boxNo)
    {
        if (string.IsNullOrEmpty(boxNo)) return MobileApiResponse<GetGoodsDetailResp>.Fail("无法识别的箱子号");
        /* -------------- 测试 --------------------------- */
        //GetGoodsDetailResp mesGoodsDetailTest = new()
        //{
        //    BoxNo = boxNo,
        //    NumPerBox = 1,
        //    GoodsNum = 23,
        //    PacketNum = 44,
        //    OtherNum = 12,
        //    GoodsId = "000",
        //    SaleOrderNo = "sa123",
        //    PacketLevel = "1",
        //    Cycle = "20天",
        //    CustomSaleOrderNo = "Csale1122",
        //    MinorWarehouseId = "99",
        //    GoodsDesc = "测试物料",
        //};
        //return MobileApiResponse<GetGoodsDetailResp>.Success(data: mesGoodsDetailTest);
        /* -------------- 测试结束 --------------------------- */
        var response = mesApiClient.GetOutBoxInfo(boxNo);
        if (!response.IsSend) return MobileApiResponse<GetGoodsDetailResp>.Fail(string.Format("请求MES货物物料信息失败，异常信息：{0}", response.Exception?.Message));
        string? responseData = response.ResponseMsg;
        if (string.IsNullOrEmpty(responseData)) return MobileApiResponse<GetGoodsDetailResp>.Fail(string.Format("MES返回的信息无法识别，信息：{0}", responseData));
        var responseDto = XmlUtils.Deserialize<GetOutBoxInfoResp>(responseData);
        if (responseDto == null) return MobileApiResponse<GetGoodsDetailResp>.Fail(string.Format("MES返回的信息无法解析，信息：{0}", responseData));
        string mesData = responseDto.Data ?? "";
        string[] dataDetail = mesData.Split(':');
        if (dataDetail.Length < 2) return MobileApiResponse<GetGoodsDetailResp>.Fail(string.Format("MES返回的信息格式不正确，信息：{0}", responseData));
        if (dataDetail[0] != "Succ") return MobileApiResponse<GetGoodsDetailResp>.Fail(string.Format("MES返回箱子错误，信息：{0}", responseData));
        string goodsInfo = dataDetail[1];
        string[] goodsDetails = goodsInfo.Split("|");
        if (goodsDetails.Length < 12) return MobileApiResponse<GetGoodsDetailResp>.Fail(string.Format("MES返回的箱子信息参数数量不足，信息：{0}", goodsDetails));
        if(goodsDetails[0] != boxNo) return MobileApiResponse<GetGoodsDetailResp>.Fail(string.Format("MES返回的箱子号和扫描的箱子号不一致，返回的箱号：{0}", goodsDetails[0]));
        string numPerBox = goodsDetails[1]; // 每包数量
        string goodsNum = goodsDetails[2]; // 包装数量
        string packetNum = goodsDetails[3]; // 包数量
        string otherNum = goodsDetails[4]; // 零包数量
        if(numPerBox.IsNotDecimal() || goodsNum.IsNotDecimal() || packetNum.IsNotDecimal() ||  otherNum.IsNotDecimal())
            return MobileApiResponse<GetGoodsDetailResp>.Fail(string.Format("MES返回的箱子信息内的数量存在不是数字情况，信息：{0}", goodsDetails));
        GetGoodsDetailResp mesGoodsDetail = new()
        {
            BoxNo = dataDetail[0],
            NumPerBox = numPerBox.ToDecimal(),
            GoodsNum = goodsNum.ToDecimal(),
            PacketNum = packetNum.ToDecimal(),
            OtherNum = otherNum.ToDecimal(),
            GoodsId = dataDetail[5],
            SaleOrderNo = dataDetail[6],
            PacketLevel = dataDetail[7],
            Cycle = dataDetail[8],
            CustomSaleOrderNo = dataDetail[9],
            MinorWarehouseId = dataDetail[10],
            GoodsDesc = dataDetail[11],
        };
        return MobileApiResponse<GetGoodsDetailResp>.Success(data: mesGoodsDetail);
    }


    /// <summary>
    /// 根据订单行和物料号
    /// </summary>
    /// <param name="request"></param>
    /// <returns></returns>
    public MobileApiResponse<CuxWmsPoLinesItfView> GetCanUseGoods(GetCanUseGoodsRequest request)
    {
        if (string.IsNullOrEmpty(request.OrderId) || string.IsNullOrEmpty(request.GoodsId) || !request.GoodsId.IsNumber())
            return MobileApiResponse<CuxWmsPoLinesItfView>.Fail("传入的参数不正确");
        var wareNoticeTabs = cuxWmsPoLinesItfDao.SelectCanUse(request.OrderId, Convert.ToInt64(request.GoodsId));
        if(wareNoticeTabs == null) return MobileApiResponse<CuxWmsPoLinesItfView>.Fail("数据服务异常，请稍后再试");
        if(wareNoticeTabs.Count < 1) return MobileApiResponse<CuxWmsPoLinesItfView>.Fail("该入库单行和物料无入库单数据");
        foreach(var cus in wareNoticeTabs)
        {
            if(cus.Quantity - cus.QuantityReceives > 0) return MobileApiResponse<CuxWmsPoLinesItfView>.Success("查询成功", cus);
        }
        return MobileApiResponse<CuxWmsPoLinesItfView>.Fail("无可入库的数量或数量不足，请检查采购单可入库数量");
    }

    
    /// <summary>
    /// 码盘入库
    /// </summary>
    /// <param name="request"></param>
    /// <returns></returns>
    public MobileApiResponse BindingVehicleIn(BindingVehicleInRequest request)
    {
        if(string.IsNullOrEmpty(request.VehicleNo)) return MobileApiResponse.Fail("载具号为空");
        var goods = request.Goods;
        if (goods == null || goods.Count < 1) return MobileApiResponse.Fail("传入的数据为空");
        List<TOnGoodsShelf> onGoodsShelfs = [];
        foreach (var item in goods)
        {
            if (string.IsNullOrEmpty(item.ProductData)) item.ProductData = "19970102";
            /* 构建空载具信息插入数据库 */
            TOnGoodsShelf onGoodsShelf = new()
            {
                LotId = UUIDUtils.GetNewUUID2(),
                GoodsId = item.ItemId,
                ProviderId = item.Segment1,
                LocationId = "",
                StoNum = 1,
                AccNum = 1,
                ShelfNum = Convert.ToInt32(item.Quantity),
                StockNum = 0,
                OnDate = DateTime.Now,
                OnShelfUserId = "Mobile_Android",
                StorageId = "-",
                StorageAreaId = item.Area,
                UpGoodsId = UUIDUtils.GetNewUUID2(),
                GoodsTypeId = item.GoodsTypeId,
                StorageMode = "码盘入库",
                ProdictionDate = new DateTime(Convert.ToInt32(item.ProductData.Substring(0, 4)), Convert.ToInt32(item.ProductData.Substring(4, 2)), Convert.ToInt32(item.ProductData.Substring(6, 2))),
                Ctl = request.VehicleNo,
                BarCode = item.SendOrderId,
                CustomerId = item.PruBatch,
                GoodsName = item.GoodsName,
                WGH = item.Weight,
                BAOZHIQI = "",
                Status = "0",
                PRODUCLOTID = item.LineLocationId,
                Unit = item.Unit,
                TaskType = request.InArea,
                GoodsMeasureId = item.Batch,
                PackingNum = 1,
                DamageNum = 1,
                Remark = "",
                PoHeaderId = item.PoHeaderId,
                PoLineId = item.PoLineId,
            };
            onGoodsShelfs.Add(onGoodsShelf);
        }
        //bool createTask = wareNoticeTabDao.UpdateStatusAndInsertInTask("1", onGoodsShelfs, request.VehicleNo);
        var insertResult = onGoodsShelfDao.Insert([.. onGoodsShelfs]);
        if (insertResult > 0) return MobileApiResponse.Success(string.Format("空载具：{0} 产生入库任务成功", request.VehicleNo));
        return MobileApiResponse.Fail(string.Format("空载具：{0} 产生入库任务失败，数据无法插入", request.VehicleNo));
    }






    /// <summary>
    /// MES 码盘入库
    /// </summary>
    /// <param name="request"></param>
    /// <returns></returns>
    public MobileApiResponse BindingVehicleInMes(BindingVehicleInReq request)
    {
        if (string.IsNullOrEmpty(request.VehicleNo) || request.BindingGoodsDetails == null) return MobileApiResponse.Fail("传入的数据无法识别");
        if (request.BindingGoodsDetails.Count < 1) return MobileApiResponse.Fail("传入的数据为空");
        /* 检验载具是否有入库任务 */
        var stackInRasks = onGoodsShelfDao.SelectWithVehicleNo(request.VehicleNo);
        if (stackInRasks == null) return MobileApiResponse.Fail("数据服务异常，请稍后再试");
        if (stackInRasks.Count > 0) return MobileApiResponse.Fail(string.Format("该载具号：{0} 存在入库任务，请核实后再试", request.VehicleNo));
        /* 检验载具是否在库存中 */
        var stocks = miStockDao.SelectWithVehicleNo(request.VehicleNo);
        if (stocks == null) return MobileApiResponse.Fail("数据服务异常，请稍后再试");
        if (stocks.Count > 0) return MobileApiResponse.Fail(string.Format("该载具号：{0} 仍在库中，请核实后再试", request.VehicleNo));
        /* 构建入库任务 */
        List<TOnGoodsShelf> onGoodsShelves = []; // 需要入库的任务
        foreach (var item in request.BindingGoodsDetails)
        {
            onGoodsShelves.Add(new()
            {
                LotId = UUIDUtils.GetNewUUID2(),
                GoodsId = item.GoodsId,
                ProviderId = item.SaleOrderNo,
                LocationId = "",
                StoNum = item.OtherNum,
                AccNum = item.NumPerBox,
                ShelfNum = item.GoodsNum,
                StockNum = item.PacketNum,
                OnDate = DateTime.Now,
                OnShelfUserId = "Mobile_Android",
                StorageId = "-",
                StorageAreaId = item.MinorWarehouseId,
                UpGoodsId = UUIDUtils.GetNewUUID2(),
                GoodsTypeId = item.PacketLevel,
                StorageMode = "MES码盘入库",
                ProdictionDate = DateTime.Now,
                Ctl = request.VehicleNo,
                BarCode = item.BoxNo,
                CustomerId = item.CustomSaleOrderNo,
                GoodsName = item.GoodsDesc,
                Status = "0",
                Unit = "-",
                TaskType = request.TaskType.ToString(),
                GoodsMeasureId = item.SaleOrderNo,
                PackingNum = 1,
                DamageNum = 1,
                ScaleUnit = item.Cycle,
                Remark = ""
            });
        }
        var insertResult = onGoodsShelfDao.Insert([.. onGoodsShelves]);
        if (insertResult > 0) return MobileApiResponse.Success(string.Format("载具：{0} 产生入库任务成功", request.VehicleNo));
        return MobileApiResponse.Fail(string.Format("载具：{0} 产生入库任务失败，数据无法插入", request.VehicleNo));
    }


    /// <summary>
    /// 获取EBS待码盘信息
    /// </summary>
    /// <returns></returns>
    public MobileApiResponse<List<CuxWmsPoLinesItf>> GetCuxData()
    {
        List<CuxWmsPoLinesItf>? cuxWmsPoLinesItfs = cuxWmsPoLinesItfDao.SelectWithStatus(0);
        if (cuxWmsPoLinesItfs == default) return MobileApiResponse<List<CuxWmsPoLinesItf>>.Fail();
        return MobileApiResponse<List<CuxWmsPoLinesItf>>.Success(data: cuxWmsPoLinesItfs);
    }

    /// <summary>
    /// Ebs 码盘入库
    /// </summary>
    /// <param name="request"></param>
    /// <returns></returns>
    public MobileApiResponse BindingVehicleInEbsOld(BindingVehicleInEbsOldReq request)
    {
        if (string.IsNullOrEmpty(request.VehicleNo) || request.BindingGoodsDetails == null) return MobileApiResponse.Fail("传入的数据无法识别");
        if (request.BindingGoodsDetails.Count < 1) return MobileApiResponse.Fail("传入的数据为空");
        /* 检验载具是否有入库任务 */
        var stackInRasks = onGoodsShelfDao.SelectWithVehicleNo(request.VehicleNo);
        if (stackInRasks == null) return MobileApiResponse.Fail("数据服务异常，请稍后再试");
        if (stackInRasks.Count > 0) return MobileApiResponse.Fail(string.Format("该载具号：{0} 存在入库任务，请核实后再试", request.VehicleNo));
        /* 检验载具是否在库存中 */
        var stocks = miStockDao.SelectWithVehicleNo(request.VehicleNo);
        if (stocks == null) return MobileApiResponse.Fail("数据服务异常，请稍后再试");
        if (stocks.Count > 0) return MobileApiResponse.Fail(string.Format("该载具号：{0} 仍在库中，请核实后再试", request.VehicleNo));
        /* 构建入库任务 */
        List<TOnGoodsShelf> onGoodsShelves = []; // 需要入库的任务
        List<(string? PoHeaderId, string? PoLineId, string? LineLocationId)> orders = [];
        foreach (var item in request.BindingGoodsDetails)
        {
            onGoodsShelves.Add(new()
            {
                LotId = UUIDUtils.GetNewUUID2(),
                GoodsId = item.GoodsId,
                ProviderId = item.SaleOrderNo,
                LocationId = "",
                StoNum = item.OtherNum,
                AccNum = item.NumPerBox,
                ShelfNum = item.GoodsNum,
                StockNum = item.PacketNum,
                OnDate = DateTime.Now,
                OnShelfUserId = "Mobile_Android",
                StorageId = "-",
                StorageAreaId = item.MinorWarehouseId,
                UpGoodsId = UUIDUtils.GetNewUUID2(),
                GoodsTypeId = item.PacketLevel,
                StorageMode = "EBS码盘入库",
                ProdictionDate = DateTime.Now,
                Ctl = request.VehicleNo,
                BarCode = item.BoxNo,
                CustomerId = item.CustomSaleOrderNo,
                GoodsName = item.GoodsDesc,
                Status = "0",
                Unit = "-",
                TaskType = request.TaskType.ToString(),
                GoodsMeasureId = item.SaleOrderNo,
                PackingNum = 1,
                DamageNum = 1,
                ScaleUnit = item.Cycle,
                Remark = ""
            });
            orders.Add((item.PoHeaderId, item.PoLineId, item.LineLocationId));
        }
        // 插入数据，更新状态
        var insertResult = onGoodsShelfDao.InsertWithCux(onGoodsShelves, orders);
        if (insertResult) return MobileApiResponse.Success(string.Format("载具：{0} 产生入库任务成功", request.VehicleNo));
        return MobileApiResponse.Fail(string.Format("载具：{0} 产生入库任务失败，数据无法插入", request.VehicleNo));
    }

    /// <summary>
    /// Ebs 码盘入库
    /// </summary>
    /// <param name="request"></param>
    /// <returns></returns>
    public MobileApiResponse BindingVehicleInEbs(BindingVehicleInEbsReq request)
    {
        if (string.IsNullOrEmpty(request.VehicleNo) || request.BindingGoodsDetails == default) return MobileApiResponse.Fail("传入的数据无法识别");
        if (request.BindingGoodsDetails.Count < 1) return MobileApiResponse.Fail("传入的数据为空");
        /* 检验载具是否有入库任务 */
        var stackInRasks = onGoodsShelfDao.SelectWithVehicleNo(request.VehicleNo);
        if (stackInRasks == default) return MobileApiResponse.Fail("数据服务异常，请稍后再试");
        if (stackInRasks.Count > 0) return MobileApiResponse.Fail(string.Format("该载具号：{0} 存在入库任务，请核实后再试", request.VehicleNo));
        /* 检验载具是否在库存中 */
        var stocks = miStockDao.SelectWithVehicleNo(request.VehicleNo);
        if (stocks == default) return MobileApiResponse.Fail("数据服务异常，请稍后再试");
        if (stocks.Count > 0) return MobileApiResponse.Fail(string.Format("该载具号：{0} 仍在库中，请核实后再试", request.VehicleNo));
        /* 检查入库单中是否有该任务 */
        //foreach (var item in request.BindingGoodsDetails)
        //{
        //    List<CuxWmsPoLinesItf> cuxWmsPos = cuxWmsPoLinesItfDao.





        //}







        //    /* 构建入库任务 */
        //    List<TOnGoodsShelf> onGoodsShelves = []; // 需要入库的任务
        //List<(string? PoHeaderId, string? PoLineId, string? LineLocationId)> orders = [];
        //foreach (var item in request.BindingGoodsDetails)
        //{
        //    onGoodsShelves.Add(new()
        //    {
        //        LotId = UUIDUtils.GetNewUUID2(),
        //        GoodsId = item.GoodsId,
        //        ProviderId = item.SaleOrderNo,
        //        LocationId = "",
        //        StoNum = item.OtherNum,
        //        AccNum = item.NumPerBox,
        //        ShelfNum = item.GoodsNum,
        //        StockNum = item.PacketNum,
        //        OnDate = DateTime.Now,
        //        OnShelfUserId = "Mobile_Android",
        //        StorageId = "-",
        //        StorageAreaId = item.MinorWarehouseId,
        //        UpGoodsId = UUIDUtils.GetNewUUID2(),
        //        GoodsTypeId = item.PacketLevel,
        //        StorageMode = "EBS码盘入库",
        //        ProdictionDate = DateTime.Now,
        //        Ctl = request.VehicleNo,
        //        BarCode = item.BoxNo,
        //        CustomerId = item.CustomSaleOrderNo,
        //        GoodsName = item.GoodsDesc,
        //        Status = "0",
        //        Unit = "-",
        //        TaskType = request.TaskType.ToString(),
        //        GoodsMeasureId = item.SaleOrderNo,
        //        PackingNum = 1,
        //        DamageNum = 1,
        //        ScaleUnit = item.Cycle,
        //        Remark = ""
        //    });
        //    orders.Add((item.PoHeaderId, item.PoLineId, item.LineLocationId));
        //}
        // 插入数据，更新状态
        //var insertResult = onGoodsShelfDao.InsertWithCux(onGoodsShelves, orders);
        //if (insertResult) return MobileApiResponse.Success(string.Format("载具：{0} 产生入库任务成功", request.VehicleNo));
        return MobileApiResponse.Fail(string.Format("载具：{0} 产生入库任务失败，数据无法插入", request.VehicleNo));
    }
}
