using BBWY.Common.Models;
using BBWY.Server.Model.Db;
using BBWY.Server.Model.Dto;
using System;
using System.Collections.Generic;
using System.Text;
using Yitter.IdGenerator;

namespace BBWY.Server.Business
{
    public class ServiceOrderBusiness : BaseBusiness, IDenpendency
    {
        public ServiceOrderBusiness(IFreeSql fsql, NLogManager nLogManager, IIdGenerator idGenerator) : base(fsql, nLogManager, idGenerator)
        {

        }

        public ServiceOrderResponse GetList(ClientQueryServiceOrderRequest request)
        {
            if (request.EndDate != null)
                request.EndDate = request.EndDate.Value.Date.AddDays(1).AddSeconds(-1);
            var list = fsql.Select<ServiceOrder, Order, OrderSku>()
                                                            .InnerJoin((s, o, osku) => s.OrderId == o.Id)
                                                            .InnerJoin((s, o, osku) => s.OrderId == osku.OrderId && s.SkuId == osku.SkuId)
                                                            .Where((s, o, osku) => s.ShopId == request.ShopId)
                                                            .WhereIf(!string.IsNullOrEmpty(request.Sku), (s, o, osku) => s.SkuId == request.Sku)
                                                            .WhereIf(!string.IsNullOrEmpty(request.Spu), (s, o, osku) => s.ProductId == request.Spu)
                                                            .WhereIf(!string.IsNullOrEmpty(request.OrderId), (s, o, osku) => s.OrderId == request.OrderId)
                                                            .WhereIf(!string.IsNullOrEmpty(request.ServiceId), (s, o, osku) => s.ServiceId == request.ServiceId)
                                                            .WhereIf(request.ServiceOrderState != null, (s, o, osku) => s.Status == request.ServiceOrderState)
                                                            .WhereIf(request.ServiceOrderState == null, (s, o, osku) => s.Status != Model.Enums.ServiceOrderState.已取消)
                                                            .WhereIf(request.ReturnDirection != null, (s, o, osku) => s.ReturnDirection == request.ReturnDirection)
                                                            .WhereIf(request.StartDate != null, (s, o, osku) => s.ApplyTime >= request.StartDate)
                                                            .WhereIf(request.EndDate != null, (s, o, osku) => s.ApplyTime <= request.EndDate)
                                                            .OrderByDescending((s, o, osku) => s.ApplyTime)
                                                            .Count(out var total)
                                                            .Page(request.PageIndex, request.PageSize)
                                                            .ToList((s, o, osku) => new ServiceOrderItemResponse
                                                            {
                                                                Id = s.Id,
                                                                ApplyTime = s.ApplyTime,
                                                                CreateTime = s.CreateTime,
                                                                ExpressName = s.ExpressName,
                                                                WayBillNo = s.WayBillNo,
                                                                ImageName = s.ImageName,
                                                                OrderId = s.OrderId,
                                                                SkuId = s.SkuId,
                                                                ProductId = s.ProductId,
                                                                ProductAppearance = s.ProductAppearance,
                                                                ProductFunction = s.ProductFunction,
                                                                ProductHealth = s.ProductHealth,
                                                                ProductPackage = s.ProductPackage,
                                                                ServiceResult = s.ServiceResult,
                                                                TransportDetails = s.TransportDetails,
                                                                WareHouseGrounpRemark = s.WareHouseGrounpRemark,
                                                                Status = s.Status,
                                                                ServiceId = s.ServiceId,
                                                                ShopId = s.ShopId,
                                                                RenewalOrderId = s.RenewalOrderId,
                                                                ReturnCheckRemark = s.ReturnCheckRemark,
                                                                AfterTotalCost = s.AfterTotalCost,
                                                                ConsumableAmount = s.ConsumableAmount,
                                                                DeliveryExpressFreight = s.DeliveryExpressFreight,
                                                                FirstFreight = s.FirstFreight,
                                                                InStorageAmount = s.InStorageAmount,
                                                                OutStorageAmount = s.OutStorageAmount,
                                                                PurchaseOrderPKId = s.PurchaseOrderPKId,
                                                                RefundAlipayOrderNo = s.RefundAlipayOrderNo,
                                                                RefundAmount = s.RefundAmount,
                                                                RefundInStorageAmount = s.RefundInStorageAmount,
                                                                RefundPurchaseAmount = s.RefundPurchaseAmount,
                                                                ReissueAfterSaleAmount = s.ReissueAfterSaleAmount,
                                                                StorageAmount = s.StorageAmount,
                                                                SDRefundFreight = s.SDRefundFreight,
                                                                RenewalType = s.RenewalType,
                                                                RenewalPurchasePlatform = s.RenewalPurchasePlatform,
                                                                RenewalPurchaseOrderId = s.RenewalPurchaseOrderId,
                                                                ReissueProductAmount = s.ReissueProductAmount,
                                                                ReissueFreight = s.ReissueFreight,
                                                                RefundTime = s.RefundTime,
                                                                RefundMerchantOrderNo = s.RefundMerchantOrderNo,

                                                                Title = osku.Title,
                                                                ItemTotal = osku.ItemTotal.Value,
                                                                Logo = osku.Logo,
                                                                Price = osku.Price.Value,
                                                                SkuItemCount = osku.ItemTotal.Value,
                                                                ReturnDirection = s.ReturnDirection,
                                                                ServiceOrderRemark = s.ServiceOrderRemark,
                                                                StatusUpdateTime = s.StatusUpdateTime,
                                                                PurchaseOrderId = s.PurchaseOrderId,
                                                                PurchasePlatform = s.PurchasePlatform,

                                                                StorageType = o.StorageType
                                                            });
            return new ServiceOrderResponse()
            {
                Count = total,
                Items = list
            };
        }

        public void EditServiceOrder(EditQueryServiceOrderRequest request)
        {
            var dbso = fsql.Select<ServiceOrder>(request.ServicePId).ToOne();
            if (dbso == null)
                throw new BusinessException("服务端不存在");

            dbso.ServiceResult = request.ServiceResult;
            dbso.ReturnDirection = request.ReturnDirection;
            dbso.RenewalOrderId = request.RenewalOrderId;
            dbso.ReturnCheckRemark = request.ReturnCheckRemark;
            dbso.RenewalType = request.RenewalType;
            dbso.RenewalPurchaseOrderId = request.RenewalPurchaseOrderId;
            dbso.RenewalPurchasePlatform = request.RenewalPurchasePlatform;

            dbso.ReissueAfterSaleAmount = request.ReissueAfterSaleAmount;
            dbso.ConsumableAmount = 0M;
            dbso.DeliveryExpressFreight = 0M;
            dbso.FirstFreight = 0M;
            dbso.InStorageAmount = 0M;
            dbso.OutStorageAmount = 0M;
            dbso.RefundInStorageAmount = 0M;
            dbso.ReissueFreight = 0M;
            dbso.ReissueProductAmount = 0M;
            dbso.StorageAmount = 0M;
            dbso.AfterTotalCost = 0M;
            dbso.SDRefundFreight = 0M;

            if (request.ServiceResult == Model.Enums.ServiceResult.退货 ||
                request.ServiceResult == Model.Enums.ServiceResult.原返 ||
                request.ServiceResult == Model.Enums.ServiceResult.线下换新 ||
                request.ServiceResult == Model.Enums.ServiceResult.仅退款)
            {
                //if(request.ReturnDirection == Model.Enums.ReturnDirection.退货仓)
                dbso.ReissueAfterSaleAmount = request.ReissueAfterSaleAmount;
            }
            else if (request.ServiceResult == Model.Enums.ServiceResult.换新)
            {
                var dbOrderCostDetail = fsql.Select<OrderCostDetail>().Where(ocd => ocd.OrderId == request.OrderId &&
                                                                                    ocd.SkuId == dbso.SkuId &&
                                                                                    ocd.IsEnabled == true).ToOne();
                if (dbOrderCostDetail != null)
                {
                    var dbPurchaseOrder = dbOrderCostDetail != null ? fsql.Select<PurchaseOrder>(dbOrderCostDetail.PurchaseOrderPKId).ToOne() : null;
                    dbso.ConsumableAmount = dbOrderCostDetail.ConsumableAmount;
                    dbso.DeliveryExpressFreight = dbOrderCostDetail.DeliveryExpressFreight;
                    dbso.FirstFreight = dbOrderCostDetail.FirstFreight;
                    dbso.ReissueProductAmount = dbOrderCostDetail.SkuAmount;
                    dbso.ReissueFreight = dbOrderCostDetail.PurchaseFreight;
                    //dbso.StorageAmount = dbOrderCostDetail.StorageAmount;
                    dbso.InStorageAmount = dbOrderCostDetail.InStorageAmount;
                    dbso.OutStorageAmount = dbOrderCostDetail.OutStorageAmount;
                }
            }
            else if (request.ServiceResult == Model.Enums.ServiceResult.商品补发)
            {
                dbso.ReissueAfterSaleAmount = request.ReissueAfterSaleAmount;
                dbso.ReissueProductAmount = request.ReissueProductAmount;
                dbso.ReissueFreight = request.ReissueFreight;
            }
            else if (request.ServiceResult == Model.Enums.ServiceResult.SD退货)
            {
                dbso.ReissueAfterSaleAmount = 0M;
                dbso.SDRefundFreight = request.SDRefundFreight;
            }
            dbso.AfterTotalCost = dbso.ReissueAfterSaleAmount + 
                                  dbso.ReissueFreight.Value +
                                  dbso.ReissueProductAmount.Value +
                                  dbso.ConsumableAmount.Value +
                                  dbso.DeliveryExpressFreight.Value +
                                  dbso.FirstFreight.Value +
                                  dbso.InStorageAmount.Value +
                                  dbso.OutStorageAmount.Value +
                                  dbso.RefundInStorageAmount.Value +    //退货入仓操作费 没有计算
                                  dbso.StorageAmount +
                                  dbso.SDRefundFreight;


            fsql.Transaction(() =>
                        {
                            fsql.Update<ServiceOrder>().SetSource(dbso).ExecuteAffrows();
                        });
        }
    }
}