using BBWY.Server.Model.Dto;
using Jd.Api;
using Jd.Api.Request;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using BBWY.Common.Extensions;

namespace BBWY.Test
{
    public class JDProductAPITest
    {
        public void GetSkus(IJdClient client, string token, string spu)
        {
            var req_skuList = new SkuReadSearchSkuListRequest()
            {
                pageSize = 50,//50
                field = "logo,saleAttrs,status,created,barCode,categoryId,multiCateProps"
            };

            req_skuList.wareId = spu;
            var response = client.Execute(req_skuList, token, DateTime.Now.ToLocalTime());
            Console.WriteLine(JsonConvert.SerializeObject(response));
        }

        public void QueryOrderCount(IJdClient client, string token)
        {
            var req = new ActyQueryRegistrationDataCountRequest();

            req.skuId = 10029655955332;

            //req.orderId = ;

            req.beginDate = "2022-12-01 00:00:00";

            req.endDate = "2022-12-26 23:59:59";

            var response = client.Execute(req, token, DateTime.Now.ToLocalTime());
            Console.WriteLine(JsonConvert.SerializeObject(response));
        }

        public void QueryTouTu(IJdClient client, string token)
        {
            var req = new TransparentImageReadFindByWareIdAndColorIdRequest();
            var mainSpu = "10022905456671";
            req.wareId = long.Parse(mainSpu);
            req.colorId = "0000000000";

            var response = client.Execute(req, token, DateTime.Now.ToLocalTime());
            Console.WriteLine(JsonConvert.SerializeObject(response));
        }

        /// <summary>
        /// 查询SKU细节图
        /// </summary>
        public void FindImageByColor(IJdClient client, string token, string spu)
        {
            var req = new ImageReadFindImagesByColorRequest();

            req.wareId = long.Parse(spu);
            req.colorId = "0000000000";

            var response = client.Execute(req, token, DateTime.Now.ToLocalTime());

            Console.WriteLine(JsonConvert.SerializeObject(response));
        }

        public void ShangJiaTest(IJdClient client, string token)
        {
            var mainSpu = "10022612803735";
            var giftSpu = "10023500913672";

            var barCode = "";
            var categoryId = "";

            IList<JToken> multiCateProps = null;

            var selectGiftSkuList = new List<ProductSkuResponse>();

            #region 取主商品sku信息
            {
                var req = new SkuReadSearchSkuListRequest()
                {
                    pageSize = 50,//50
                    field = "logo,saleAttrs,status,created,barCode,categoryId,multiCateProps"
                };

                req.wareId = mainSpu;
                var res = client.Execute(req, token, DateTime.Now.ToLocalTime());

                var skuList = ((JArray)res.Json["jingdong_sku_read_searchSkuList_responce"]["page"]["data"]).Select(s => new ProductSkuResponse()
                {
                    Id = s.Value<string>("skuId"),
                    ProductId = s.Value<string>("wareId"),
                    Price = s.Value<decimal>("jdPrice"),
                    Title = s["saleAttrs"] != null ? string.Join("-", s["saleAttrs"].Select(a => a["attrValueAlias"][0].ToString())) : string.Empty,
                    Logo = $"https://img13.360buyimg.com/n9/s80x80_{s.Value<string>("logo")}",
                    State = s.Value<int>("status"),
                    //CreateTime = s.Value<long>("created").StampToDateTime(),
                    Source = s
                }).ToList();

                barCode = skuList[0].Source.Value<string>("barCode");
                categoryId = skuList[0].Source.Value<string>("categoryId");

                multiCateProps = skuList[0].Source["multiCateProps"] != null ? skuList[0].Source["multiCateProps"].ToList() : null;
            }
            #endregion

            #region 取赠品信息
            {
                var giftTitleList = new List<string>() { "粉丝价", "放心购", "闪电退款", "免费", "价格保护", "极速审核", "质量保护", "运费险" };
                var req = new SkuReadSearchSkuListRequest()
                {
                    pageSize = 50,//50
                    field = "logo,saleAttrs,status,created,barCode,categoryId,multiCateProps"
                };
                req.wareId = giftSpu;
                var res = client.Execute(req, token, DateTime.Now.ToLocalTime());

                var skuList = ((JArray)res.Json["jingdong_sku_read_searchSkuList_responce"]["page"]["data"]).Select(s => new ProductSkuResponse()
                {
                    Id = s.Value<string>("skuId"),
                    ProductId = s.Value<string>("wareId"),
                    Price = s.Value<decimal>("jdPrice"),
                    Title = s["saleAttrs"] != null ? string.Join("-", s["saleAttrs"].Select(a => a["attrValueAlias"][0].ToString())) : string.Empty,
                    Logo = $"https://img13.360buyimg.com/n9/s80x80_{s.Value<string>("logo")}",
                    State = s.Value<int>("status"),
                    //CreateTime = s.Value<long>("created").StampToDateTime(),
                    Source = s
                }).ToList();

                foreach (var sku in skuList)
                {
                    if (!giftTitleList.Contains(sku.Title))
                        continue;
                    selectGiftSkuList.Add(sku);
                }
            }
            #endregion

            #region 获取细节图

            //IList<JToken> imagesByColorList = new List<JToken>();
            //{
            //    var req = new ImageReadFindImagesByColorRequest();

            //    req.wareId = long.Parse(mainSpu);
            //    req.colorId = "0000000000";

            //    var response = client.Execute(req, token, DateTime.Now.ToLocalTime());
            //    if (response.Json == null)
            //        response.Json = JObject.Parse(response.Body);
            //    imagesByColorList = response.Json["jingdong_image_read_findImagesByColor_responce"]["images"].ToList();
            //}
            #endregion

            //#region 获取透图
            //JToken toutuJToken = null;
            //{
            //    var req = new TransparentImageReadFindByWareIdAndColorIdRequest();
            //    req.wareId = long.Parse(mainSpu);
            //    req.colorId = "0000000000";

            //    var response = client.Execute(req, token, DateTime.Now.ToLocalTime());
            //    if (response.Json == null)
            //        response.Json = JObject.Parse(response.Body);
            //    toutuJToken = response.Json["jingdong_transparentImage_read_findByWareIdAndColorId_responce"]["imageList"];
            //}
            //#endregion

            #region 获取销售属性

            IList<JToken> colorSaleAttrs = null;
            {
                var req = new CategoryReadFindAttrsByCategoryIdUnlimitCateRequest();
                req.cid = long.Parse(categoryId);
                req.attributeType = 4;
                req.field = "attrValueList,attrGroup";
                var response = client.Execute(req, token, DateTime.Now.ToLocalTime());
                Console.WriteLine("销售属性");
                if (response.Json == null)
                    response.Json = JObject.Parse(response.Body);
                var colorProperty = response.Json["jingdong_category_read_findAttrsByCategoryIdUnlimitCate_responce"]["findattrsbycategoryidunlimitcate_result"].FirstOrDefault(j => j.Value<string>("name") == "颜色");
                if (colorProperty == null)
                    throw new Exception("缺少颜色属性");
                colorSaleAttrs = colorProperty["attrValueList"].ToList();
            }
            #endregion

            #region 增量保存sku

            List<string> newSkuList = new List<string>();
            {
                var skusParamList = new List<SkuWriteUpdateSkusItem>();
                var updateSkuTitleParamList = new List<WareWriteUpdateWareSaleAttrvalueAliasRequestItem>();
                var imageWriteUpdateRequestList = new List<ImageWriteUpdateRequest>();

                var takeColorIndex = colorSaleAttrs.Count() - 1;
                for (var i = 0; i < selectGiftSkuList.Count(); i++)
                {
                    var giftSku = selectGiftSkuList[i];
                    var colorProperty = colorSaleAttrs[takeColorIndex];

                    var p = new SkuWriteUpdateSkusItem()
                    {
                        type = "com.jd.pop.ware.ic.api.domain.Sku",
                        wareId = long.Parse(mainSpu),
                        //skuId = long.Parse(sku.Id),
                        jdPrice = giftSku.Price,
                        stockNum = 500,
                        barCode = barCode,
                        saleAttrs = new List<SkuWriteUpdateSkusItemSaleAttrs>()
                        {
                            new SkuWriteUpdateSkusItemSaleAttrs()
                            {
                                type = "com.jd.pop.ware.ic.api.domain.Prop",
                                attrId = colorProperty.Value<string>("attId"),
                                attrValues = new List<string>() { colorProperty.Value<string>("id") },
                                index = takeColorIndex
                            }
                        }
                    };

                    p.multiCateProps = new List<SkuWriteUpdateSkusItemSaleAttrs>();
                    if (multiCateProps != null && multiCateProps.Count() > 0)
                    {
                        foreach (var multiCateProp in multiCateProps)
                        {
                            var m = new SkuWriteUpdateSkusItemSaleAttrs();
                            m.type = "com.jd.pop.ware.ic.api.domain.Prop";
                            m.attrId = multiCateProp.Value<string>("attrId");
                            m.attrValues = multiCateProp.Value<JArray>("attrValues").Select(x => x.ToString()).ToList();
                            p.multiCateProps.Add(m);
                        }
                    }

                    //修改标题参数
                    updateSkuTitleParamList.Add(new WareWriteUpdateWareSaleAttrvalueAliasRequestItem()
                    {
                        attrId = p.saleAttrs[0].attrId,
                        attrValues = p.saleAttrs[0].attrValues,
                        attrValueAlias = new List<string>() { giftSku.Title }
                    });

                    //修改商品细节图参数
                    var imgUrlBuilder = new StringBuilder();
                    var imgIndexBuilder = new StringBuilder();
                    imgUrlBuilder.Append($"{giftSku.Logo.Substring(giftSku.Logo.IndexOf("jfs"))},");
                    imgIndexBuilder.Append("1,");
                    imageWriteUpdateRequestList.Add(new ImageWriteUpdateRequest()
                    {
                        wareId = long.Parse(mainSpu),
                        colorId = colorProperty.Value<string>("id"),
                        imgUrl = imgUrlBuilder.ToString().Trim(','),
                        imgIndex = imgIndexBuilder.ToString().Trim(',')
                    });

                    takeColorIndex--;
                    skusParamList.Add(p);
                }

                #region 上架sku
                {
                    var req = new SkuWriteUpdateSkusRequest();
                    req.wareId = long.Parse(mainSpu);
                    req.skus = skusParamList;
                    Console.WriteLine("上架请求参数");
                    Console.WriteLine(JsonConvert.SerializeObject(req));
                    var res = client.Execute(req, token, DateTime.Now.ToLocalTime());

                    Console.WriteLine();
                    Console.WriteLine("上架返回内容");
                    Console.WriteLine(JsonConvert.SerializeObject(res));

                    if (res.Json == null)
                        res.Json = JObject.Parse(res.Body);
                    newSkuList = res.Json["jingdong_sku_write_updateSkus_responce"]["skuList"].ToList().Select(x => x.Value<string>("skuId")).ToList();
                }
                #endregion

                #region 改名
                {
                    Console.WriteLine();
                    Console.WriteLine();

                    var request = new WareWriteUpdateWareSaleAttrvalueAliasRequest()
                    {
                        wareId = long.Parse(mainSpu),
                        props = updateSkuTitleParamList
                    };

                    Console.WriteLine("改名请求参数");
                    Console.WriteLine(JsonConvert.SerializeObject(request));
                    var res = client.Execute(request, token, DateTime.Now.ToLocalTime());

                    Console.WriteLine();
                    Console.WriteLine("改名返回内容");
                    Console.WriteLine(JsonConvert.SerializeObject(res));
                }
                #endregion

                #region 修改细节图
                foreach (var request in imageWriteUpdateRequestList)
                {
                    Console.WriteLine("修改细节图请求参数");
                    Console.WriteLine(JsonConvert.SerializeObject(request));
                    var res = client.Execute(request, token, DateTime.Now.ToLocalTime());

                    Console.WriteLine();
                    Console.WriteLine("修改细节图返回内容");
                    Console.WriteLine(JsonConvert.SerializeObject(res));
                    Console.WriteLine();
                }
                #endregion
            }
            #endregion

            #region 删除SKU
            foreach (var sku in newSkuList)
            {
                var req = new SkuWriteDeleteSkuRequest();
                req.skuId = long.Parse(sku);
                var res = client.Execute(req, token, DateTime.Now.ToLocalTime());

                Console.WriteLine();
                Console.WriteLine("删除sku返回结果");
                Console.WriteLine(JsonConvert.SerializeObject(res));
                Console.WriteLine();
            }
            #endregion
        }

        public void 修改属性别名(IJdClient client, string token)
        {
            var mainSpu = "10022905456671";
            var request = new WareWriteUpdateWareSaleAttrvalueAliasRequest();
            request.wareId = long.Parse(mainSpu);
            request.props = new List<WareWriteUpdateWareSaleAttrvalueAliasRequestItem>();
            request.props.Add(new WareWriteUpdateWareSaleAttrvalueAliasRequestItem()
            {
                attrId = "1001050679",
                attrValues = new List<string>() { "2912651180" },
                attrValueAlias = new List<string>() { "粉丝价" }
            });

            request.props.Add(new WareWriteUpdateWareSaleAttrvalueAliasRequestItem()
            {
                attrId = "1001050679",
                attrValues = new List<string>() { "2912655473" },
                attrValueAlias = new List<string>() { "放心购" }
            });

            request.props.Add(new WareWriteUpdateWareSaleAttrvalueAliasRequestItem()
            {
                attrId = "1001050679",
                attrValues = new List<string>() { "2912660446" },
                attrValueAlias = new List<string>() { "闪电退款" }
            });

            Console.WriteLine("请求参数");
            Console.WriteLine(JsonConvert.SerializeObject(request));
            var res = client.Execute(request, token, DateTime.Now.ToLocalTime());

            Console.WriteLine();
            Console.WriteLine("返回内容");
            Console.WriteLine(JsonConvert.SerializeObject(res));

        }

        public void QuerySPU(IJdClient client,string token)
        {
            var req_productList = new WareReadSearchWare4ValidRequest()
            {
                orderField = "modified",
                orderType = "desc",
                pageSize = 50,
                pageNo = 1,
                field = "created,logo"
            };
 
            req_productList.wareId = "10023015553755";

            var res = client.Execute(req_productList, token, DateTime.Now.ToLocalTime());

            Console.WriteLine(JsonConvert.SerializeObject(res));

            //return new ProductListResponse()
            //{
            //    Count = rep_productList.page.totalItem,
            //    Items = ((JArray)rep_productList.Json["jingdong_ware_read_searchWare4Valid_responce"]["page"]["data"]).Select(p => new ProductResponse()
            //    {
            //        Id = p.Value<string>("wareId"),
            //        Title = p.Value<string>("title"),
            //        ProductItemNum = p.Value<string>("itemNum"),
            //        State = p.Value<int>("wareStatus"),
            //        CreateTime = p.Value<long>("created").StampToDateTime()
            //    }).ToList()
            //};
        }

        public void FindWareById(IJdClient client, string token)
        {
            var req = new WareReadFindWareByIdRequest();

            req.wareId = 10023500913672;
            req.field = "barCode,categoryId,brandName";

            var response = client.Execute(req, token, DateTime.Now.ToLocalTime());
            Console.WriteLine(JsonConvert.SerializeObject(response));
        }

        public void GetPromotionById(IJdClient client, string token)
        {
            SellerPromotionV2GetRequest req = new SellerPromotionV2GetRequest();
            //req.ip = "abc";
            //req.port = "abc";
            req.promoId = 5606602511;
            req.promoType = 4;


            var response = client.Execute(req, token, DateTime.Now.ToLocalTime());
            Console.WriteLine(JsonConvert.SerializeObject(response));

        }
    }
}