using BBWY.Common.Http;
using BBWY.Common.Models;
using BBWY.Server.Model;
using BBWY.Server.Model.Dto;
using Microsoft.Extensions.Caching.Memory;
using Newtonsoft.Json;
using QuanTan.SDK.Client;
using QuanTan.SDK.Model;
using System.Linq;
using static BBWY.Server.Model.Enums;

namespace BBWY.Server.Business
{
    public class QuanTanBusiness : PlatformSDKBusiness
    {
        public override Enums.Platform Platform => Enums.Platform.拳探;
        private QuanTanOrderClient quanTanOrderClient;

        public QuanTanBusiness(IMemoryCache memoryCache, NLogManager nLogManager, RestApiService restApiService) : base(memoryCache, nLogManager)
        {
            this.quanTanOrderClient = new QuanTanOrderClient(restApiService, nLogManager.Default());
        }

        public override PayPurchaseOrderResponse PayPurchaseOrder(PayPurchaseOrderRequest payPurchaseOrderRequest)
        {
            var qtResponse = quanTanOrderClient.PayOrder(new QuanTanPayOrderRequest
            {
                orderId = payPurchaseOrderRequest.OrderId,
                userAccount = payPurchaseOrderRequest.AppToken
            }, payPurchaseOrderRequest.AppKey, payPurchaseOrderRequest.AppSecret);
            if (qtResponse.Status == 200) return new PayPurchaseOrderResponse { Success = true, PurchaseOrderState = PurchaseOrderState.等待采购 };

            if (qtResponse.Message != null && qtResponse.Message.Contains("已支付"))
            {
                throw new BusinessException("无需重复支付");
                //var res = quanTanOrderClient.GetOrderDetail(new QuanTanGetOrderDetailRequest
                //{
                //    orderId = payPurchaseOrderRequest.OrderId,
                //    userAccount = payPurchaseOrderRequest.AppToken
                //}, payPurchaseOrderRequest.AppKey, payPurchaseOrderRequest.AppSecret);
                //if (res.Status == 200)
                //{
                //    PurchaseOrderState purchaseOrder = PurchaseOrderState.待发货;
                //    switch (res.Data.Status)
                //    {
                //        case -1:
                //            purchaseOrder = PurchaseOrderState.已取消;
                //            break;
                //        case 0:
                //            purchaseOrder = PurchaseOrderState.待发货;
                //            break;
                //        case 1:
                //            purchaseOrder = PurchaseOrderState.待收货;
                //            break;
                //        case 2:

                //        case 3:
                //            purchaseOrder = PurchaseOrderState.已完成;
                //            break;
                //    }
                //    return new PayPurchaseOrderResponse { Success = true, PurchaseOrderState = purchaseOrder };

                //}

            }
            if (qtResponse.Message != null && qtResponse.Message.Contains("已删除"))
            {
                return new PayPurchaseOrderResponse { Success = true, PurchaseOrderState = PurchaseOrderState.已取消 };
            }
            throw new BusinessException(qtResponse.Message);

            return new PayPurchaseOrderResponse
            {
                Success = false,
                Msg = qtResponse.Message
            };
        }
        public override CancelPurchaseOrderResponse CancelPurchaseOrder(CancelPurchaseOrderRequest request)
        {
            var qtResponse = quanTanOrderClient.CancelOrder(new QuanTanCancelOrderRequest
            {
                orderId = request.OrderId,
                userAccount = request.AppToken,
                remark = request.Remark,
            }, request.AppKey, request.AppSecret);
            if (qtResponse.Status == 200) return new CancelPurchaseOrderResponse { Success = true };

            if (qtResponse.Message != null && qtResponse.Message.Contains("已删除"))
            {
                return new CancelPurchaseOrderResponse { Success = true };
            }

            throw new BusinessException(qtResponse.Message);


            return new CancelPurchaseOrderResponse
            {
                Success = false,
                Msg = qtResponse.Message
            };

            //将数据库设置取消


        }



        public override PreviewOrderResponse PreviewOrder(PreviewOrderReuqest previewOrderReuqest)
        {
            var quantanPreviewOrderRequest = new QuanTanPreviewOrderRequest()
            {
                clientOrderId = "",
                userAccount = previewOrderReuqest.AppToken,
                receipt = new QuanTanPreviewOrderReceipt()
                {
                    province = previewOrderReuqest.Consignee.Province,
                    city = previewOrderReuqest.Consignee.City,
                    area = previewOrderReuqest.Consignee.County,
                    town = previewOrderReuqest.Consignee.Town,
                    address = previewOrderReuqest.Consignee.Address,
                    phone = previewOrderReuqest.Consignee.Mobile,
                    realName = previewOrderReuqest.Consignee.ContactName
                },
                buyInfo = previewOrderReuqest.CargoParamList.Select(p => new QuanTanPreviewOrderProduct()
                {
                    productId = p.ProductId,
                    productSku = p.SkuId,
                    quantity = p.Quantity
                }).ToList()
            };

            var qtResponse = quanTanOrderClient.PreviewOrder(quantanPreviewOrderRequest, previewOrderReuqest.AppKey, previewOrderReuqest.AppSecret);
            if (qtResponse.Status != 200)
                throw new BusinessException(qtResponse.Message);

            return new PreviewOrderResponse()
            {
                TotalAmount = qtResponse.Data.TotalPrice,
                FreightAmount = qtResponse.Data.PostagePrice,
                ProductAmount = qtResponse.Data.ProductPrice,
                Extensions = qtResponse.Data.CartIds
                //OrderTradeType= new OrderTradeTypeResponse()
            };
        }

        public override CreateOnlinePurchaseOrderResponse FastCreateOrder(CreateOnlinePurchaseOrderRequest createOnlinePurchaseOrderRequest)
        {
            var quantanCreateOrderRequest = new QuanTanCreateOrderRequest()
            {
                clientOrderId = createOnlinePurchaseOrderRequest.OrderId,
                userAccount = createOnlinePurchaseOrderRequest.AppToken,
                cartIds = createOnlinePurchaseOrderRequest.Extensions,
                autoPay = createOnlinePurchaseOrderRequest.AutoPay,
                remark = createOnlinePurchaseOrderRequest.Remark,
                receipt = new QuanTanCreateOrderReceipt()
                {
                    province = createOnlinePurchaseOrderRequest.Consignee.Province,
                    city = createOnlinePurchaseOrderRequest.Consignee.City,
                    area = createOnlinePurchaseOrderRequest.Consignee.County,
                    town = createOnlinePurchaseOrderRequest.Consignee.Town,
                    address = createOnlinePurchaseOrderRequest.Consignee.Address,
                    phone = createOnlinePurchaseOrderRequest.Consignee.Mobile,
                    realName = createOnlinePurchaseOrderRequest.Consignee.ContactName
                },
                extended = JsonConvert.SerializeObject(new
                {
                    BuyerAccount = createOnlinePurchaseOrderRequest.AppToken,
                    BelongSkus = createOnlinePurchaseOrderRequest.SourceSku,
                    createOnlinePurchaseOrderRequest.SourceShopName,
                    createOnlinePurchaseOrderRequest.IntoStoreType
                })
            };
            var qtResponse = quanTanOrderClient.CreateOrder(quantanCreateOrderRequest, createOnlinePurchaseOrderRequest.AppKey, createOnlinePurchaseOrderRequest.AppSecret);
            if (qtResponse.Status != 200)
                throw new BusinessException(qtResponse.Message);

            var payStatus = !string.IsNullOrEmpty(qtResponse.Data.PayStatus) ? qtResponse.Data.PayStatus.ToLower() : string.Empty;
            //if (payStatus != "success")
            //    throw new BusinessException($"拳探账户余额不足,支付失败,请前往拳探进行手动支付");


            return new CreateOnlinePurchaseOrderResponse()
            {
                PurchaseOrderId = qtResponse.Data.OrderId,
                Sn = qtResponse.Data.OrderSn,
                IsPay = payStatus == "success"
            };
        }

        public override OnlinePurchaseOrderSimpleResponse GetOrderSimpleInfo(GetOrderInfoRequest getOrderInfoRequest)
        {
            var qtResponse = quanTanOrderClient.GetOrderDetail(new QuanTanGetOrderDetailRequest()
            {
                orderId = getOrderInfoRequest.OrderId,
                userAccount = getOrderInfoRequest.AppToken
            }, getOrderInfoRequest.AppKey, getOrderInfoRequest.AppSecret);
            if (qtResponse.Status != 200)
                throw new BusinessException($"获取订单详情失败{getOrderInfoRequest.OrderId},{qtResponse.Message}");
            return new OnlinePurchaseOrderSimpleResponse()
            {
                PurchaseOrderId = getOrderInfoRequest.OrderId,
                Sn = qtResponse.Data.OrderSn,
                FreightAmount = qtResponse.Data.TotalPostage,
                ProductAmount = qtResponse.Data.ProductPrice,
                TotalAmount = qtResponse.Data.TotalPrice,
                ItemList = qtResponse.Data.OrderProduct.Select(o => new OnlinePurchaseOrderSkuSimpleResponse()
                {
                    ProductAmount = o.ProductPrice,
                    FreightAmount = o.PostagePrice,
                    Price = o.Price,
                    ProductId = o.ProductId,
                    SkuId = o.ProductSku,
                    Quantity = o.Quantity
                }).ToList()
            };
        }
    }
}