using BBWYB.Common.Http;
using QuanTan.SDK.Client.Supplier;
using QuanTan.SDK.Models.Supplier;
using SDKAdapter.OperationPlatform.Models;

namespace SDKAdapter.OperationPlatform.Client
{
    public class OP_QuanTanClient : OP_PlatformClient
    {
        private QuanTan_Supplier_ProductClient supplier_ProductClient;
        private QuanTan_Supplier_OrderClient supplier_OrderClient;
        private QuanTan_Supplier_ExpressClient supplier_ExpressClient;

        public OP_QuanTanClient(RestApiService restApiService) : base(restApiService)
        {
            this.supplier_ProductClient = new QuanTan_Supplier_ProductClient(restApiService);
            this.supplier_OrderClient = new QuanTan_Supplier_OrderClient(restApiService);
            this.supplier_ExpressClient = new QuanTan_Supplier_ExpressClient(restApiService);
        }

        public override AdapterEnums.PlatformType Platform => AdapterEnums.PlatformType.拳探;

        public override OP_ProductListResponse GetProductList(OP_QueryProductRequest request)
        {
            var qtResponse = supplier_ProductClient.GetProductList(new QuanTan_Supplier_SearchSpuRequest()
            {
                page = request.PageIndex,
                pageSize = request.PageSize,
                productId = request.Spu,
                storeId = request.AppToken
            }, request.AppKey, request.AppSecret);

            if (qtResponse.Status != 200)
                throw new Exception(qtResponse.Message);

            return new OP_ProductListResponse()
            {
                Count = qtResponse.Data.Count,
                Items = qtResponse.Data.List.Select(qtp => new OP_ProductResponse()
                {
                    Id = qtp.ProductId,
                    BrandName = string.Empty,
                    CreateTime = null,
                    Logo = qtp.Image,
                    ProductItemNum = string.Empty,
                    State = 0,
                    Title = qtp.ProductName
                }).ToList()
            };
        }

        public override OP_ProductSkuListResponse GetProductSkuList(OP_QueryProductSkuRequest request)
        {
            var qtResponse = supplier_ProductClient.GetProductSkuList(new QuanTan_Supplier_SearchSkuRequest()
            {
                page = request.PageIndex,
                pageSize = request.PageSize,
                storeId = request.AppToken,
                productId = request.Spu,
                productSku = request.Sku
            }, request.AppKey, request.AppSecret);

            if (qtResponse.Status != 200)
                throw new Exception(qtResponse.Message);

            return new OP_ProductSkuListResponse()
            {
                Count = qtResponse.Data.Count,
                Items = qtResponse.Data.List.Select(qtps => new OP_ProductSkuResponse()
                {
                    CreateTime = null,
                    Id = qtps.ProductSku,
                    Logo = qtps.SkuImage,
                    Price = qtps.SkuPrice,
                    ProductId = qtps.ProductId,
                    State = 0,
                    Title = qtps.SkuName
                }).ToList()
            };
        }

        public override OP_OrderListResponse GetOrderList(OP_QueryOrderRequest request)
        {
            request.OrderId = request.OrderId ?? string.Empty;
            var qtRequest = new QuanTan_Supplier_QueryOrderReuqest()
            {
                storeId = request.AppToken,
                orderId = request.OrderId,
                order = request.SortTimeField == AdapterEnums.SortTimeField.Modify ? "update_time" : "create_time",
                orderBy = request.SortType == AdapterEnums.SortType.Asc ? "asc" : "desc",
                page = request.PageIndex,
                pageSize = request.PageSize,
                source = 1
            };
            if (request.SortTimeField == AdapterEnums.SortTimeField.Modify)
            {
                if (request.StartDate != null)
                    qtRequest.updateStart = request.StartDate;
                if (request.EndDate != null)
                    qtRequest.updateEnd = request.EndDate;
            }
            else if (request.SortTimeField == AdapterEnums.SortTimeField.Start)
            {
                if (request.StartDate != null)
                    qtRequest.createStart = request.StartDate;
                if (request.EndDate != null)
                    qtRequest.createEnd = request.EndDate;
            }

            var qtResponse = supplier_OrderClient.GetOrderList(qtRequest, request.AppKey, request.AppSecret);
            if (qtResponse.Status != 200)
                throw new Exception(qtResponse.Message);
            return new OP_OrderListResponse()
            {
                Count = qtResponse.Data.Count,
                Items = qtResponse.Data.List.Select(qto => new OP_OrderResponse()
                {
                    OrderPlatform = AdapterEnums.PlatformType.拳探,
                    OrderId = qto.OrderId,
                    OrderSn = qto.OrderSn,
                    ClientOrderId = qto.ClientOrderId,
                    UserAccount = qto.UserAccount,
                    Extended = qto.Extended,
                    BuyerRemark = qto.BuyRemark,
                    VenderRemark = qto.MerRemark,
                    Consignee = new OP_OrderConsigneeResponse()
                    {
                        Address = qto.Receipt.Address,
                        City = qto.Receipt.City,
                        ContactName = qto.Receipt.RealName,
                        County = qto.Receipt.Area,
                        Mobile = qto.Receipt.Phone,
                        Province = qto.Receipt.Province,
                        Town = qto.Receipt.Town
                    },
                    StartTime = qto.CreateTime,
                    ModifyTime = qto.UpdateTime,
                    FreightAmount = qto.TotalPostage,
                    OrderState = qto.Status.ToString(),
                    EndTime = qto.Status == 3 ? qto.UpdateTime : null,
                    OrderPayment = qto.TotalPrice,
                    OrderProductAmount = qto.ProductPrice,
                    OrderSource = qto.Source,
                    OrderTotalAmount = qto.TotalPrice,
                    PaidInAmount = qto.TotalPrice,
                    PackAmount = qto.PackingCharge,
                    PayType = 0,
                    IsPay = qto.Paid == 1,
                    PayTime = qto.Paid == 1 ? qto.PayTime : null,
                    PreferentialAmount = 0,
                    SellerPreferentialAmount = 0,
                    OrderSkuList = qto.OrderProduct.Select(qtosku => new OP_OrderProductSkuResponse()
                    {
                        Id = qtosku.OrderProductId,
                        ProductId = qtosku.ProductId,
                        ProductTitle = qtosku.Title,
                        SkuId = qtosku.ProductSku,
                        Quantity = qtosku.Quantity,
                        SkuLogo = qtosku.SkuInfo.Image,
                        SkuPrice = qtosku.SkuInfo.Price,
                        SkuTitle = qtosku.SkuInfo.Title,
                        ProductAmount = qtosku.ProductPrice,
                        FreightAmount = qtosku.PostagePrice,
                        PackAmount = qtosku.PackingCharge
                    }).ToList(),
                    DeliveryResponse = new OP_OrderDeliveryResponse()
                    {
                        ExpressId = qto.Delivery?.ExpressId ?? string.Empty,
                        ExpressName = qto.Delivery?.ExpressName ?? string.Empty,
                        WayBillNo = qto.Delivery?.ExpressSn ?? string.Empty
                    }
                }).ToList()
            };
        }

        public override void OutStock(OP_OutStockRequest request)
        {
            var qtResponse = supplier_OrderClient.OutStock(new QuanTan_Supplier_OutStockRequest()
            {
                expressId = request.ExpressId,
                orderId = request.OrderId,
                waybillNo = request.WayBillNo
            }, request.AppKey, request.AppSecret);
            if (qtResponse.Status != 200)
                throw new Exception(qtResponse.Message);
        }

        public override IList<OP_QueryExpressCompanyResponse> GetExpressCompanyList(OP_QueryExpressCompanyRequest request)
        {
            return supplier_ExpressClient.GetExpressCompanyList().Select(p => new OP_QueryExpressCompanyResponse()
            {
                ExpressId = p.ExpressId,
                ExpressName = p.ExpressName,
            }).ToList();
        }

        public override void CancelOrder(OP_CancelOrderRequest request)
        {
            var qtResponse = supplier_OrderClient.CancelOrder(new QuanTan_Supplier_CancelOrderRequest()
            {
                editAdmin = request.AppToken,
                orderId = request.OrderId,
                remark = request.Remark
            }, request.AppKey, request.AppSecret);
            if (qtResponse.Status != 200)
                throw new Exception(qtResponse.Message);
        }

        public override void EditPrice(OP_EditPriceRequest request)
        {
            var qtResponse = supplier_OrderClient.EditPrice(new QuanTan_Supplier_EditPriceRequest()
            {
                editAdmin = request.AppToken,
                orderId = request.OrderId,
                orderProduct = request.EditItems.Select(item => new QuanTan_Supplier_EditPriceSkuRequest()
                {
                    orderProductId = item.OrderSkuId,
                    postagePrice = item.Freight,
                    price = item.Price,
                    packingChargeSingle = item.InPackAmountPrice
                }).ToList()
            }, request.AppKey, request.AppSecret);

            if (qtResponse.Status != 200)
                throw new Exception(qtResponse.Message);
        }

        public override void EditProductPrice(OP_EditProductPriceRequest request)
        {
            var qtResponse = supplier_ProductClient.EditProductPrice(new QuanTan_Supplier_EditProductPriceRequest()
            {
                productId = request.Spu,
                editAdmin = request.AppToken,
                skuList = request.EditSkuList.Select(x => new QuanTan_Supplier_EditProductSkuPriceRequest()
                {
                    price = x.Price,
                    skuId = x.Sku
                }).ToList()
            }, request.AppKey, request.AppSecret);
            if (qtResponse.Status != 200)
                throw new Exception(qtResponse.Message);
        }
    }
}