using BBWYB.Common.Models;
using BBWYB.Server.Model._1688;
using BBWYB.Server.Model.Dto;
using HtmlAgilityPack;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using SDKAdapter.PurchasePlatform.Models;
using System.Text;
using System.Text.RegularExpressions;
using static BBWYB.Server.Model.Enums;

namespace BBWYB.Server.Business._1688Helper
{
    /// <summary>
    /// 手动支付采购单业务
    /// </summary>
    public class Collect1688Helper
    {

        private string _1688Cookie { get; set; }
        public Action<string> AddLog { get; set; }

        public Collect1688Helper(string _1688Cookie)
        {
            this._1688Cookie = _1688Cookie;
        }

        private string UrlEncode(string str, string encodingStr)
        {
            Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
            return System.Web.HttpUtility.UrlEncode(str, Encoding.GetEncoding(encodingStr));
        }

        ///// <summary>
        ///// 
        ///// </summary>
        ///// <param name="offerId"></param>
        //public ProductModel GetProductMsg(string offerId)//获取限制条件
        //{
        //    string url = $"https://detail.1688.com/offer/{offerId}.html";
        //    using HttpClient http = new HttpClient();

        //    //添加cookie
        //    http.DefaultRequestHeaders.Add("Cookie", _1688Cookie);
        //    http.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36 Edg/124.0.0.0");
        //    var res = http.GetAsync(url).Result;
        //    if (res.IsSuccessStatusCode)
        //    {
        //        Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
        //        var html = res?.Content?.ReadAsStringAsync().Result;

        //        string ipvId = GetRegexValue(html, "\"ipvId\":\"([^\"]+)\"");   //可以不带ipvId
        //        //"sellerUserId":3199397430,
        //        //string sellerUserId = GetRegexValue(html, "\"sellerUserId\":([^,]+),");

        //        //"mixNumber": 2,
        //        int mixNumber = int.Parse(GetRegexValue(html, "\"mixNumber\":([^,]+),"));
        //        return new ProductModel() { MixNumber = mixNumber, IpvId = ipvId };
        //    }
        //    AddLog("获取商品信息失败");
        //    return null;
        //}


        public OrderParameter GetProductParameter(List<PP_OrderProductParamRequest> orderProducts, OrderModel orderModel, string ipvId)
        {
            var flow = orderModel.ToString(); //下单类型
            string url = $"https://order.1688.com/order/smart_make_order.htm?p=detail&_input_charset=utf-8&fromkv={UrlEncode($"offerdetail:pc;ipvId:{ipvId}", "utf-8")}";

            List<string> orderProductIds = new List<string>();
            foreach (var orderProduct in orderProducts)
            {
                orderProductIds.Add(@$"{{""specId"":""{orderProduct.SpecId}"",""offerId"":{orderProduct.ProductId},""quantity"":{orderProduct.Quantity},""flow"":""{flow}"",""ext"":{{""sceneCode"":""""}},""selectedTradeServices"":[]}}");

            }

            var id = UrlEncode($"[{string.Join(",", orderProductIds)}]", "gb2312");

            string postData = $"id={id}&flow=xxx";


            var response = PostHtml(url, postData, _1688Cookie);

            if (response == null || !response.IsSuccessStatusCode)
            {
                AddLog("获取订单参数失败");
                return null;
            }
            //            string lvid = response.Headers.Get("Eagleeye-Traceid");

            string lvid = "";
            if (response.Headers.Contains("Eagleeye-Traceid"))
            {
                //获取响应头 Resin-Trace的值

                var trace = response.Headers.GetValues("Eagleeye-Traceid");
                if (trace.Any())
                {
                    lvid = trace.FirstOrDefault();
                }
            }

            string html = response.Content.ReadAsStringAsync().Result;
            var orderUrl = GetRegexValue(html, "action=\"([^\"]+)\"").Replace("&amp;", "&");

            //data-default-checked-address-id="6012255930"
            var address = GetRegexValue(html, "data-default-checked-address-id=\"([^\"]+)\"");

            //name="_fm.smarta._0.t" value="350502005"
            var townCode = GetRegexValue(html, "name=\"_fm.smarta._0.t\" value=\"([^\"]+)\"");

            var res = new OrderParameter()
            {
                Lvid = lvid,
                OrderUrl = orderUrl,
                Address = address,
                TownCode = townCode,
                IpvId = ipvId
            };
            HtmlAgilityPack.HtmlDocument htmlDoc = new HtmlAgilityPack.HtmlDocument();
            htmlDoc.LoadHtml(html);

            HtmlNode csrfInput = htmlDoc.DocumentNode.SelectSingleNode("//input[@name='_csrf_token']");

            if (csrfInput != null)
            {
                // 获取 value 属性的值
                string csrfTokenValue = csrfInput.GetAttributeValue("value", "");
                res.Csrf_token = csrfTokenValue;
            }


            // 使用XPath选择器获取<div id="order" class="layout">元素
            HtmlNode orderDiv = htmlDoc.DocumentNode.SelectSingleNode("//div[@id='order']");

            if (orderDiv != null)
            {
                List<OrderGroupParameter> OrderGroupParameterList = new List<OrderGroupParameter>();

                // 获取<div id="order" class="layout">内的所有子元素
                HtmlNodeCollection childNodes = orderDiv.ChildNodes;
                foreach (HtmlNode node in childNodes)
                {
                    // 处理每个子元素
                    string innerText = node.InnerText; // 获取元素的文本内容
                    string outerHtml = node.OuterHtml; // 获取元素的HTML代码
                                                       // 其他操作...

                    if (node.Name == "div")
                    {
                        var zone_orders = node.Descendants("div")
                               .Where(div => div.Attributes.Contains("class") && div.GetAttributeValue("class", "").Equals("zone-order", StringComparison.OrdinalIgnoreCase));

                        foreach (HtmlNode zone_order in zone_orders)
                        {
                            // 获取 data-source 属性的值
                            string dataSourceValue = zone_order.GetAttributeValue("data-source", "")?.Replace("&quot;", "\"");

                            var groupHeaderJson = JsonConvert.DeserializeObject<dynamic>(dataSourceValue);
                            //sellerMemberId
                            string sellerMemberId = groupHeaderJson.sellerMemberId.ToString();
                            //sellerUserId
                            string sellerUserId = groupHeaderJson.sellerUserId.ToString();
                            ////buyerMemberId
                            //string buyerMemberId = groupHeaderJson.buyerMemberId.ToString();
                            //orderOutId
                            string orderOutId = groupHeaderJson.orderOutId.ToString();
                            //group
                            string group = groupHeaderJson.group.ToString();
                            //belong
                            string belong = groupHeaderJson.belong.ToString();
                            //flow 下单类型
                            flow = groupHeaderJson?.flow?.ToString();
                            //bizType
                            string bizType = groupHeaderJson?.bizType?.ToString();


                            var groupDiv = zone_order.Descendants("li")
                                                 .Where(li => li.Attributes.Contains("class") && li.GetAttributeValue("class", "").Equals("step-item step-item-first", StringComparison.OrdinalIgnoreCase));
                            //.SelectSingleNode("//li[@class='step-item step-item-first']");

                            if (groupDiv == null)
                            {
                                continue;
                            }

                            string stepName = "";
                            foreach (var item in groupDiv)
                            {
                                var groupDivDataSource = item.GetAttributeValue("data-source", "");
                                if (groupDivDataSource != null)
                                {

                                    var json = JsonConvert.DeserializeObject<dynamic>(groupDivDataSource?.Replace("&quot;", "\""));
                                    group = json.group.ToString();
                                    stepName = json.stepName.ToString();
                                }
                            }




                            OrderGroupParameter orderGroupParameter = new OrderGroupParameter()
                            {
                                Group = group,
                                StepName = stepName,
                                OrderOutId = orderOutId,
                                MemberId = sellerMemberId,
                                SellerUserId = sellerUserId,
                                Belong = belong,


                            };





                            var groupOrders = zone_order.Descendants("tr")
                                                 .Where(tr => tr.Attributes.Contains("data-group-name"));
                            List<decimal> productAmountList = new List<decimal>();
                            List<OrderProductParameter> OrderProductParameterList = new List<OrderProductParameter>();
                            foreach (var groupOrder in groupOrders)
                            {

                                if (groupOrder.Name == "tr")
                                {

                                    var data_source = groupOrder.GetAttributeValue("data-source", "");
                                    string groutOuterHtml = groupOrder.OuterHtml;
                                    if (data_source != null)
                                    {

                                        var sumCarriage = GetRegexValue(groutOuterHtml, "\"fee\":([^,]+),");
                                        if (sumCarriage == null)
                                        {
                                            sumCarriage = "0";
                                        }

                                        //"freightId":"18605534"
                                        var freightId = GetRegexValue(groutOuterHtml, "\"freightId\":\"([^\"]+)\"");
                                        //'freightId':'16850501'
                                        if (freightId == null)
                                        {
                                            freightId = GetRegexValue(groutOuterHtml, "'freightId':'([^\']+)'");
                                        }



                                        //'outId':'general_705889664759_df9e522ec29afb80a682fcaac1dce50c',
                                        var outId = GetRegexValue(data_source, "'outId':'([^']+)'");



                                        //"discountFee":"0"
                                        var discountFee = decimal.Parse(GetRegexValue(data_source, "\"discountFee\":\"([^\"]+)\"") ?? "0");


                                        var cargoKey = GetRegexValue(data_source, "'cargoKey':'([^']+)'");
                                        //'unitPrice':'6.33'
                                        var unitPrice = decimal.Parse(GetRegexValue(data_source, "'unitPrice':'([^']+)'"));
                                        var payFee = (int)(unitPrice * 100);

                                        //'quantity':1.0
                                        int quantity = (int)(decimal.Parse(GetRegexValue(data_source, "'quantity':([^,]+),")));

                                        //'ext':'{\&quot;detailOrderBizAttributes\&quot;:{\&quot;b_cargo_from\&quot;:\&quot;offerdetail:pc;ipvId:2150462317125683404374580e106c\&quot;}}',
                                        var ext = GetRegexValue(data_source, "'ext':'([^']+)'")?.Replace("\\&quot;","\"");

                                        //'offerId':'563883060952',
                                        var offerId = GetRegexValue(data_source, "'offerId':'([^']+)'");

                                        //'skuId':'ea66ab9ceff1fbcc8d0b97d4926e476f',
                                        var spectId = GetRegexValue(data_source, "'skuId':'([^']+)'");

                                        //'tbSkuId':'5408119750040',
                                        var skuId = GetRegexValue(data_source, "'tbSkuId':'([^']+)'");
                                        //'offerPriceRangeJson':[{&quot;ba&quot;:1,&quot;ea&quot;:0,&quot;p&quot;:2.5}]
                                        var offerPriceRangeJson = GetRegexValue(data_source, "'offerPriceRangeJson'\\s*:\\s*\\[(.*?)\\]")?.Replace("&quot;", "\"");


                                        var productAmount = quantity * unitPrice - discountFee;
                                        productAmountList.Add(productAmount);


                                        OrderProductParameterList.Add(new OrderProductParameter()
                                        {
                                            ProductAmount = productAmount,
                                            CargoKey = cargoKey,
                                            ProductId = offerId,
                                            SkuId = skuId,
                                            SpectId = spectId,
                                            UnitPrice = unitPrice,
                                            Quantity = quantity,
                                            DiscountFee = discountFee,
                                            SumCarriage = decimal.Parse(sumCarriage),
                                            FreightId = freightId,
                                            OutId = outId,
                                            OfferPriceRangeJson = offerPriceRangeJson,
                                            Ext = ext,

                                        });
                                    }

                                }
                            }

                            var totalProductAmount = OrderProductParameterList.Sum(p => p.ProductAmount);

                            var actualPay = OrderProductParameterList.Sum(p => p.ProductAmount + p.SumCarriage);


                            orderGroupParameter.SumCarriage = OrderProductParameterList.Sum(p => p.SumCarriage);
                            orderGroupParameter.ActualPay = actualPay;
                            orderGroupParameter.ActualPayFee = (int)(actualPay * 100);
                            orderGroupParameter.TotalProductAmount = totalProductAmount;
                            orderGroupParameter.PayFee = (int)(totalProductAmount * 100);
                            orderGroupParameter.OrderProductParameterList = OrderProductParameterList;
                            OrderGroupParameterList.Add(orderGroupParameter);
                        }


                    }
                }

                res.OrderGroupParameterList = OrderGroupParameterList;


            }

            return res;

        }


        /// <summary>
        /// 输入临时收货地址(姓名 手机号 收货地址)或者直接输入地址   (主要获取邮编编码) //feiyu 19959858952 福建省泉州市鲤城区金龙街道古龙路媒人桥2号三文公寓一楼齐越中转仓
        /// </summary>
        public AddressModel InputAddress(string adress, string _csrf_token)
        {
            //callback=jQuery17207000444400310621_1711938052406&address=feiyu+19959858952+%E7%A6%8F%E5%BB%BA%E7%9C%81%E6%B3%89%E5%B7%9E%E5%B8%82%E9%B2%A4%E5%9F%8E%E5%8C%BA%E9%87%91%E9%BE%99%E8%A1%97%E9%81%93%E5%8F%A4%E9%BE%99%E8%B7%AF%E5%AA%92%E4%BA%BA%E6%A1%A52%E5%8F%B7%E4%B8%89%E6%96%87%E5%85%AC%E5%AF%93%E4%B8%80%E6%A5%BC%E9%BD%90%E8%B6%8A%E4%B8%AD%E8%BD%AC%E4%BB%93&_csrf_token=42b5ba743ad1a219f275a0f2b8f13303&_input_charset=utf-8
            string url = $"https://wuliu.1688.com/address/ajax/address_parse.jsx?callback=jQuery17207000444400310621_1711938052406&address={UrlEncode(adress, "utf-8")}&_csrf_token={_csrf_token}&_input_charset=utf-8";

            /*
             jQuery17207000444400310621_1711938052406({
    "data": {
        "addressDetail": "金龙街道古龙路媒人桥2号三文公寓一楼齐越中转仓",
        "city": "泉州市",
        "cityCode": 350500,
        "district": "鲤城区",
        "districtCode": 350502,
        "divisionZip": "362000",
        "mobileNO": "19959858952",
        "personalName": "feiyu",
        "province": "福建省",
        "provinceCode": 350000
    },
    "success": true
})
             */

            using HttpClient http = new HttpClient();
            http.BaseAddress = new Uri(url);
            http.DefaultRequestHeaders.Add("Cookie", _1688Cookie);
            http.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36 Edg/124.0.0.0");
            var res = http.GetAsync(url).Result;
            if (res.IsSuccessStatusCode)
            {
                Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
                var html = res?.Content?.ReadAsStringAsync().Result;
                if (html.Contains("会话已过期,请刷新页面"))
                {
                    AddLog?.Invoke("登陆已过期,请刷新页面");
                    return null;
                }

                var addressCode = GetRegexValue(html, "\"districtCode\":(\\d+)");
                var divisionZip = GetRegexValue(html, "\"divisionZip\":\"([^\"]+)\"");
                var mobileNO = GetRegexValue(html, "\"mobileNO\":\"([^\"]+)\"");
                var personalName = GetRegexValue(html, "\"personalName\":\"([^\"]+)\"");
                var addressDetail = GetRegexValue(html, "\"addressDetail\":\"([^\"]+)\"");
                return new AddressModel()
                {
                    AddressDetail = addressDetail,
                    DivisionZip = divisionZip,
                    MobileNO = mobileNO,
                    PersonalName = personalName,
                    AddressCode = addressCode
                };
            }

            return null;



        }

        //刷新物流列表
        public OrderParameter ReflashAdress(OrderParameter oldData, AddressModel addressModel, OrderModel orderModel)
        {

            string url = "https://order.1688.com/order/smart_ajax.jsx?_input_charset=utf-8";



            List<string> generalOrders_orderGroupKeyList = new List<string>();
            foreach (var orderGroup in oldData.OrderGroupParameterList)
            {
                List<string> orderList = new List<string>();
                foreach (var orderProduct in orderGroup.OrderProductParameterList)
                {
      
                    string freightId = orderProduct.FreightId;
                    string order = $@"{{""offerId"":""{orderProduct.ProductId}"",""skuId"":""{orderProduct.SpectId}"",""tbSkuId"":""{orderProduct.SkuId}"",""hasSkuUmp"":""false"",""outId"":""{orderProduct.OutId}"",""quantity"":{orderProduct.Quantity},""isfreefreight"":0,""marketingScene"":"""",""offerPriceRangeJson"":[{orderProduct.OfferPriceRangeJson}],""unitPrice"":""{orderProduct.UnitPrice}"",""bundle"":"""",""couple"":"""",""freightId"":""{freightId}"",""rebate"":0,""buyerBearServiceFee"":false,""gift"":""0""}}";
                    orderList.Add(order);
                }


                string orderGroupData = $@"""{orderGroup.Group}"":{{""order"":[{string.Join(",", orderList)}] ,""orderOutId"":""{orderGroup.OrderOutId}"",""orderBundle"":"""",""orderCouple"":"""",""type"":""address"",""memberId"":""{orderGroup.MemberId}"",""sellerUserId"":""{orderGroup.SellerUserId}"",""operate"":"""",""countyCode"":""{addressModel.AddressCode}"",""addressCode"":""{addressModel.AddressCode}"",""address"":""-1"",""townCode"":"""",""umpSysAvailble"":""1"",""bizType"":""{orderModel}"",""bizScene"":""{orderModel}"",""transportType"":""multiStep"",""groupId"":""{orderGroup.Group}"",""tplCode"":""assureTrade"",""countryISOCode"":"""",""channelId"":"""",""mobile"":""{addressModel.MobileNO}"",""orderAmount"":""{orderGroup.ActualPayFee}"",""carriage"":""{orderGroup.SumCarriage}"",""belong"":""{orderGroup.Belong}""}}";

                generalOrders_orderGroupKeyList.Add(orderGroupData);
            }

            string generalOrders_orderGroupKey = string.Join(",", generalOrders_orderGroupKeyList);



            string data = $"{{\"ordersUmp.0\":{{\"orderBlockAjaxParam\":{{\"{orderModel}Orders..orderGroupKey\":{{{generalOrders_orderGroupKey}}}}},\"changeType\":\"address\",\"selectedCrossPromotionId\":\"\",\"selectedCrossPromotionIdMap\":\"{{}}\",\"bizScene\":\"{orderModel}\"}}}}";

            string postData = $"tasks=ordersUmp.0&data={UrlEncode(data, "UTF-8")}&_csrf_token={oldData.Csrf_token}&lvId={oldData.Lvid}";
            var response = PostHtml(url, postData, _1688Cookie);

            if (response == null || !response.IsSuccessStatusCode)
            {
                AddLog("获取订单参数失败");
                return null;
            }
            // string lvid = response.Headers.Get("Eagleeye-Traceid");

            if (response.Headers.Contains("Eagleeye-Traceid"))
            {
                //获取响应头 Resin-Trace的值

                var trace = response.Headers.GetValues("Eagleeye-Traceid");
                if (trace.Any())
                {
                    oldData.Lvid = trace.FirstOrDefault();
                }
            }

            var html = response.Content.ReadAsStringAsync().Result;

            var json = JsonConvert.DeserializeObject<dynamic>(html);

            dynamic jsonObj = JsonConvert.DeserializeObject(html);


            if (jsonObj["success"].ToString() == "true")
            {


                var datawuliu = jsonObj["data"]["ordersUmp.0"]["data"]["orderPromotion"].ToString();

                //获取键值对的方式
                bool isReflash = false;
                JObject jbO = JObject.Parse(datawuliu);
                foreach (var property in jbO.Properties())
                {
                    var key = property.Name;
                    var groupData = oldData.OrderGroupParameterList.SingleOrDefault(o => o.Group == key);

                    var value = property.Value;
                    //获取value下的 freight
                    var freight = (JObject)value["freight"];
                    //获取freight的键值对的key值
                    foreach (var item in freight.Properties())
                    {
                        var freightKey = item.Name;
                        var freightValue = item.Value;
                        //获取freight的键值对的value值

                        //totalFreightFee的值
                        var wuliufee = freightValue["totalFreightFee"].ToString();


                        groupData.OrderProductParameterList.OrderByDescending(s => s.SumCarriage).FirstOrDefault(g => g.FreightId == freightKey).SumCarriage = decimal.Parse(wuliufee) / 100m;



                        isReflash = true;
                    }


                    var order = (JObject)value["order"];

                    foreach (var item in order.Properties())
                    {
                        var outId = item.Name;

                        var orderProduct = groupData.OrderProductParameterList.FirstOrDefault(g => g.OutId == outId);

                        if (orderProduct != null)
                        {
                            orderProduct.ProductAmount = item.Value["amount"].ToObject<decimal>();

                            //selectedUmpBundle 的couple

                            var skuSelectedUmpBundle = item.Value["selectedUmpBundle"];

                            if (skuSelectedUmpBundle != null)
                            {
                                var couple = skuSelectedUmpBundle["couple"].ToString();

                                var sceneUnitPrice = skuSelectedUmpBundle["sceneUnitPrice"].ToObject<decimal>();


                                var discountFee = skuSelectedUmpBundle["price"].ToObject<decimal>();//折扣价格

                                var skuChooseFreeFreight = skuSelectedUmpBundle["isFreeFreight"].ToObject<bool>() ? 1 : 0;




                                orderProduct.Couple = couple;
                                orderProduct.ChooseFreeFreight = skuChooseFreeFreight;

                                orderProduct.ProductAmount = orderProduct.UnitPrice * orderProduct.Quantity - discountFee;

                            }


                        }







                    }

                    //selectedShopUmpBundle


                    var selectedShopUmpBundle = value["selectedShopUmpBundle"];

                    bool isFreeFreight = false;
                    decimal shopDiscountFee = 0;
                    string shopCouple = "";
                    if (selectedShopUmpBundle != null)
                    {
                        shopCouple = selectedShopUmpBundle["couple"].ToString();//店铺优惠券
                        isFreeFreight = selectedShopUmpBundle["isFreeFreight"].ToObject<bool>();//是否包邮
                        shopDiscountFee = selectedShopUmpBundle["price"].ToObject<decimal>();//店铺优惠金额
                    }
                    groupData.ChooseFreeFreight = isFreeFreight ? 1 : 0;
                    groupData.PromotionId = shopCouple;




                    if (isFreeFreight)
                        groupData.SumCarriage = 0;
                    else
                        groupData.SumCarriage = groupData.OrderProductParameterList.Select(s => s.SumCarriage).Sum();

                    groupData.TotalProductAmount = groupData.OrderProductParameterList.Select(s => s.ProductAmount).Sum();

                    groupData.ActualPay = groupData.TotalProductAmount + groupData.SumCarriage - shopDiscountFee;
                    groupData.ActualPayFee = (int)(groupData.ActualPay * 100);









                }
                if (isReflash)
                {
                    AddLog?.Invoke("刷新地址成功");
                }
                else
                {
                    AddLog?.Invoke("刷新地址失败");
                }

            }
            else
            {
                AddLog?.Invoke("刷新地址失败");
            }

            return oldData;

        }



        public string GetCookieStr(string cookies, string cookieName)
        {
            //通过;分割
            var cookieDatas = cookies.Split(';', StringSplitOptions.RemoveEmptyEntries);
            foreach (var cookie in cookieDatas)
            {
                var cookieParams = cookie.Split('=');
                if (cookieParams.Count() >= 2)
                {
                    var key = cookieParams[0]?.Trim();
                    var value = cookieParams[1]?.Trim();
                    if (key == cookieName)
                    {
                        return value;
                    }
                }
            }
            return "";
        }

        private string GetRegexValue(string html, string patternStr)
        {
            //使用正则匹配出值

            var regex = Regex.Match(html, patternStr);

            if (regex.Success)
            {
                return regex.Groups[1].Value;
            }
            return null;

        }



        //获取_csrf_token参数
        public string GetCsrfToken(string cookies)
        {
            var csrf_token = GetCookieStr(cookies, "_csrf_token");

            if (csrf_token == null)
            {
                return null;
            }
            return Md5Helper.Md5_32(csrf_token);
        }

        //加入购物车
        public void AddCart(string offerId, string specId, int quantity, string IpvId)
        {
            try
            {
                //时间戳
                var timestamp = DateTimeOffset.UtcNow.ToUnixTimeSeconds();
                string url = "https://cart.1688.com/ajax/safe/add_to_cart_list_new.jsx";

                string ext = $"{{\"sceneCode\":\"offerdetail:pc;ipvId:{IpvId}\"}}";

                string specData = $"[{{\"amount\":{quantity},\"specId\":\"{specId}\",\"selectedTradeServices\":[]}}]";
                string postData = $"type=offer&cargoIdentity={offerId}&returnType=url&needTotalPrice=false&promotionSwitch=false&_csrf_token={GetCsrfToken(_1688Cookie)}&t={timestamp}&purchaseType=&ext={UrlEncode(ext, "utf-8")}&specData={UrlEncode(specData, "utf-8")}";




                var res = PostHtml(url, postData, _1688Cookie);
                if (res.IsSuccessStatusCode)
                {
                    var html = res.Content.ReadAsStringAsync().Result;

                    var json = JsonConvert.DeserializeObject<dynamic>(html);

                    if (json.success)
                    {
                        AddLog?.Invoke("成功加入购物车");
                    }
                    else
                    {
                        AddLog?.Invoke("加入购物车失败");
                    }

                }
            }
            catch (Exception ex)
            {

                AddLog?.Invoke($"加入购物车失败:{ex.Message}");
            }


        }



        public ApiResponse<string> CommitOrder(PrewOrderResponse prewOrderResponse, string remarkMesg)
        {
            var productParameter = prewOrderResponse.orderParameter;
            var orderModel = prewOrderResponse.OrderModel;

            var adressModel = prewOrderResponse.AddressModel;


            var flow = orderModel.ToString(); //下单类型
            var ipvId = productParameter.IpvId;
            var addressDetail = adressModel.AddressDetail;
            var townCode = productParameter.TownCode;
            var csrf_token = productParameter.Csrf_token;
            var orderUrl = productParameter.OrderUrl;
            var addressCode = adressModel.AddressCode;
            var lvid = productParameter.Lvid;
            var personalName = adressModel.PersonalName;
            var mobileNO = adressModel.MobileNO;
            var _csrf_token = productParameter.Csrf_token;

            var divisionZip = adressModel.DivisionZip;


            //                                    213e38fa17117750507943145ee537
            string fromkv = $"offerdetail:pc;ipvId:{productParameter.IpvId}";//24885ba917116953616677208e

            //string remarkMesg = "拖鞋";//备注消息

            string cna = GetCookieStr(_1688Cookie, "cna");

            List<string> _fm_sm_0_iList = new List<string>();

            List<string> _fm_sma_cargoKeyList = new List<string>();

            List<string> _fm_smartin_group_meList = new List<string>();

            List<string> smarts_mList = new List<string>();

            List<string> _fm_smart_group_meList = new List<string>();


            List<string> _fm_sma_group_g_fList = new List<string>();

            foreach (var OrderGroupParameter in productParameter.OrderGroupParameterList)
            {
                //'mixAmount':'100'
                var group = OrderGroupParameter.Group;
                var discountFee = OrderGroupParameter.DiscountFee;
                var sumCarriage = OrderGroupParameter.SumCarriage.ToString("0.00");
                var stepName = OrderGroupParameter.StepName;
                var totalProductAmount = OrderGroupParameter.TotalProductAmount.ToString("0.00");
                var actualPay = OrderGroupParameter.ActualPay.ToString("0.00");
                var actualPayFee = OrderGroupParameter.ActualPayFee;
                var payFee = OrderGroupParameter.PayFee;
                var shopCouple = OrderGroupParameter.PromotionId;
                var chooseFreeFreight = OrderGroupParameter.ChooseFreeFreight;

                
                foreach (var orderProductParameter in OrderGroupParameter.OrderProductParameterList)
                {
                    var cargoKey = orderProductParameter.CargoKey;

                    var unitPrice = orderProductParameter.UnitPrice.ToString("0.00");
                    var productAmount = orderProductParameter.ProductAmount.ToString("0.00");
                    var quantity = orderProductParameter.Quantity;
                    var offerId = orderProductParameter.ProductId;
                    var specId = orderProductParameter.SpectId;
                    var tbSkuId = orderProductParameter.SkuId;

                    var skuChooseFreeFreight = orderProductParameter.ChooseFreeFreight;

                    var _fm_sm_0_i_ = @$"{{""cartId"":"""",""offerId"":""{offerId}"",""specId"":""{specId}"",""tbSkuId"":""{tbSkuId}"",""hasSkuUmp"":""false"",""quantity"":{quantity},""tradeMode"":""multiStep"",""tradeWay"":""100"",""templateCode"":""assureTrade"",""flow"":""{flow}"",""subflow"":"""",""ext"":""{{\""sceneCode\"":\""\""}}""}}";
                    _fm_sm_0_iList.Add(_fm_sm_0_i_);

                    string _fm_sma_cargoKey = @$"{{""group"":""{group}"",""cargoKey"":""{cargoKey}"",""quantity"":{quantity},""unitPrice"":""{unitPrice}"",""offerId"":""{offerId}"",""specId"":""{specId}"",""tbSkuId"":""{tbSkuId}"",""hasSkuUmp"":""false"",""chooseFreeFreight"":{skuChooseFreeFreight},""productAmount"":""{productAmount}"",""discount"":1,""isVirtual"":""0"",""gift"":"""",""cartId"":"""",""promotionId"":""{orderProductParameter.Couple}"",""ext"":""{{\""sceneCode\"":\""\""}}"",""buyerCharge"":false,""marketingScene"":""""}}";
                    _fm_sma_cargoKeyList.Add($"_fm.smar.{cargoKey}.m={UrlEncode(_fm_sma_cargoKey, "gb2312")}");




                }
                string mixAmount = "100";
                string smarts_m = @$"[{{""group"":""{group}"",""stepNo"":""1"",""templateId"":""30"",""stepName"":""{UrlEncode(stepName, "GB2312")}"",""instantPay"":""0"",""sellerActionName"":"""",""buyerPayTimeout"":""0"",""buyerConfirmTimeout"":""0"",""needSellerAction"":""0"",""transferAfterConfirm"":""0"",""needSellerCallNext"":""0"",""isStepPayAll"":""0"",""agreement"":"""",""needLogistics"":""1"",""percent"":""1.0"",""deliveryPercent"":""1.0"",""payFee"":""{payFee}"",""actualPayFee"":""{actualPayFee}"",""discountFee"":""{discountFee}"",""itemDiscountFee"":""0"",""price"":""0"",""amount"":""1"",""postFee"":""0"",""mergedJsonVar"":""""}}]";
                smarts_mList.Add(smarts_m);

                string _fm_smart_group_me = @$"{{""group"":""{group}"",""tplCode"":""assureTrade"",""message"":""{remarkMesg}"",""sumCarriage"":""{sumCarriage}"",""totalAmount"":""{actualPay}"",""totalProductAmount"":""{totalProductAmount}"",""chooseFreeFreight"":{chooseFreeFreight},""mixAmount"":""{mixAmount}"",""mixNumber"":""1"",""promotionId"":""{shopCouple}"",""umpSysAvailble"":""1"",""toleranceFreight"":""${{model.toleranceCollection.toleranceFreight}}"",""checkCarriage"":1,""filledCarriage"":""0.00"",""isNeedSellerConfirmFlag"":""0"",""lvid"":""{lvid}"",""fundUsageSelected"":""0"",""hasTaosampleCard"":""0"",""anonymousBuyer"":true,""payEntry"":""multiStep"",""bizType"":""{flow}"",""payWay"":""100"",""orderCodFee"":0,""crossPromotionIds"":[],""crossPromotionIdsMap"":{{}},""crossShopPromotions"":[],""terminal"":""pc_browser_null_0.0.0"",""cna"":""{cna}"",""fromkv"":""{fromkv}""}}";
                _fm_smart_group_meList.Add($"_fm.smart.{group}.me={UrlEncode(_fm_smart_group_me, "GB2312")}");


                string _fm_smartin_group_me = @$"{{ ""invoiceFlag"":false,""invoiceType"":0,""invoiceMode"":"""",""streetAddress"":"""",""registerPhone"":"""",""bank"":"""",""accountId"":"""",""companyName"":"""",""localInvoiceId"":""undefined"",""taxpayerIdentifier"":"""",""extParams"":{{ ""email"":""""}},""group"":""{group}""}}";

                _fm_smartin_group_meList.Add($"_fm.smartin.{group}.me={UrlEncode(_fm_smartin_group_me, "GB2312")}&_fm.smartin.{group}.i=false");
                _fm_sma_group_g_fList.Add($"_fm.sma.{group}.g={group}&_fm.sma.{group}.f={flow}");
            }



            var _fm_smarts_0_m = $"[{string.Join(",", smarts_mList)}]";



            var _fm_sm_0_i = $"[{string.Join(",", _fm_sm_0_iList)}]";


            string cargoKeyStr = string.Join("&", _fm_sma_cargoKeyList);

            string _fm_smart_group_meStr = string.Join("&", _fm_smart_group_meList);

            string _fm_smartin_group_meStr = string.Join("&", _fm_smartin_group_meList);

            string _fm_smart_group_g_fStr = string.Join("&", _fm_sma_group_g_fList);




            string url = orderUrl;

            string key = GetRegexValue(orderUrl, "key=(\\d+)");
            Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);

            string adress = UrlEncode(addressDetail, "GB2312");//
            string userName = UrlEncode(personalName, "GB2312");
            string phoneNumber = UrlEncode(mobileNO, "GB2312");


            var timestamp = DateTimeOffset.UtcNow.ToUnixTimeSeconds();

            string postData = $"action=SmartMakeOrderAction&event_submit_execute=Action&fromWhere=confirmOrder&fromType=normal&_fm.smarti._0.me=%7B%7D&_fm.smarti._0.i=false&_csrf_token={_csrf_token}" +
                      $"&_fm.sm._0.f=xxx&_fm.sm._0.i={UrlEncode(_fm_sm_0_i, "GB2312")}&_fm.sm._0.k={key}&_fm.sm._0.a=0&_fm.sm._0.q=&_fm.sm._0.in=&_fm.sm._0.fr=&_fm.sm._0.fro=&_fm.sm._0.s=&_fm.sm._0.se=&_fm.sm._0.p=-1&_fm.sm._0.e=&_fm.sm._0.is=false&_fm.sm._0.null=cart&_fm.sm._0.ex=" +
                      $"&_fm.sm._0.sc=&_fm.smart._PAGE_LEVEL_.me=%7B%22group%22%3A%22_PAGE_LEVEL_%22%7D&{_fm_smart_group_meStr}&{cargoKeyStr}" +
                      $"&{_fm_smart_group_g_fStr}&_fm.smartm._0.m=&_fm.smarta._0.ar={addressCode}&_fm.smarta._0.p={addressCode}&_fm.smarta._0.c={addressCode}&_fm.smarta._0.po={divisionZip}&_fm.smarta._0.ad={adress}&_fm.smarta._0.t=&_fm.smarta._0.to=&_fm.smarta._0.f={userName}" +
                      $"&_fm.smarta._0.ph=&_fm.smarta._0.m={phoneNumber}&_fm.smarta._0.i=false&_fm.smarta._0.is=true&_fm.smarta._0.a=-1&{_fm_smartin_group_meStr}&" +
                      $"_fm.smarts._0.m={_fm_smarts_0_m}&_fm.r._0.w={timestamp}";

            var s = GetOrderId(url, postData, _1688Cookie);

            if (s != null)
            {
                AddLog?.Invoke($"下单成功,返回订单号:{s}");
                return new ApiResponse<string>() { Code = 200, Data = s };
            }
            else
            {
                AddLog?.Invoke("下单失败");
                return new ApiResponse<string>() { Code = 1000, Msg = "下单失败" };
            }

            return new ApiResponse<string>() { Code = 1000, Msg = "下单失败" };


        }

        private string GetOrderId(string url, string postData, string cookie)
        {
            var response = PostHtml(url, postData, cookie);
            if (response.IsSuccessStatusCode)
            {
                Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
                var sss = response.Content.ReadAsStringAsync().Result;
                if (response.Headers.Contains("Resin-Trace"))
                {
                    //获取响应头 Resin-Trace的值

                    var trace = response.Headers.GetValues("Resin-Trace");
                    if (trace.Any())
                    {
                        var traceValue = trace.FirstOrDefault();

                        if (traceValue.Contains("biz_order"))
                        {
                            var biz_order = GetRegexValue(traceValue, "biz_order=(\\d+[,]?\\d+)");//获取下单号


                            return biz_order;

                        }
                    }
                }
            }
            return null;
        }


        public HttpResponseMessage PostHtml(string url, string postData, string cookie)
        {
            HttpClient client = new HttpClient();


            //使用 application/x-www-form-urlencoded post提交
            client.DefaultRequestHeaders.Add("Cookie", cookie);
            //postData = "action=SmartMakeOrderAction&event_submit_execute=Action&fromWhere=confirmOrder&fromType=normal&_fm.smarti._0.me=%7B%7D&_fm.smarti._0.i=false&_csrf_token=e107b86e348b5ff07dd1d1e4b0dff58f&_fm.sm._0.f=xxx&_fm.sm._0.i=%5B%7B%22cartId%22%3A%22%22%2C%22offerId%22%3A%22755527819845%22%2C%22specId%22%3A%2248b8df3db448c6bad0e847c317886360%22%2C%22tbSkuId%22%3A%225207346876796%22%2C%22hasSkuUmp%22%3A%22false%22%2C%22quantity%22%3A1%2C%22tradeMode%22%3A%22multiStep%22%2C%22tradeWay%22%3A%22100%22%2C%22templateCode%22%3A%22assureTrade%22%2C%22flow%22%3A%22general%22%2C%22subflow%22%3A%22%22%2C%22ext%22%3A%22%7B%5C%22sceneCode%5C%22%3A%5C%22%5C%22%7D%22%7D%5D&_fm.sm._0.k=171179300009192219&_fm.sm._0.a=0&_fm.sm._0.q=&_fm.sm._0.in=&_fm.sm._0.fr=&_fm.sm._0.fro=&_fm.sm._0.s=&_fm.sm._0.se=&_fm.sm._0.p=-1&_fm.sm._0.e=&_fm.sm._0.is=false&_fm.sm._0.null=detail&_fm.sm._0.ex=&_fm.sm._0.sc=&_fm.smart._PAGE_LEVEL_.me=%7B%22group%22%3A%22_PAGE_LEVEL_%22%7D&_fm.smart.d4d7e431d5b30a44df6a8b2e50a58237.me=%7B%22group%22%3A%22d4d7e431d5b30a44df6a8b2e50a58237%22%2C%22tplCode%22%3A%22assureTrade%22%2C%22message%22%3A%22%22%2C%22sumCarriage%22%3A%222.40%22%2C%22totalAmount%22%3A%228.73%22%2C%22totalProductAmount%22%3A%226.33%22%2C%22chooseFreeFreight%22%3A0%2C%22mixAmount%22%3A%22%22%2C%22mixNumber%22%3A%221%22%2C%22promotionId%22%3A%22%22%2C%22umpSysAvailble%22%3A%221%22%2C%22toleranceFreight%22%3A%22%24%7Bmodel.toleranceCollection.toleranceFreight%7D%22%2C%22checkCarriage%22%3A1%2C%22filledCarriage%22%3A%220.00%22%2C%22isNeedSellerConfirmFlag%22%3A%220%22%2C%22lvid%22%3A%2224885bad17117929999545039e%22%2C%22fundUsageSelected%22%3A%220%22%2C%22hasTaosampleCard%22%3A%220%22%2C%22anonymousBuyer%22%3Afalse%2C%22payEntry%22%3A%22multiStep%22%2C%22bizType%22%3A%22general%22%2C%22payWay%22%3A%22100%22%2C%22orderCodFee%22%3A0%2C%22crossPromotionIds%22%3A%5B%5D%2C%22crossPromotionIdsMap%22%3A%7B%7D%2C%22crossShopPromotions%22%3A%5B%5D%2C%22terminal%22%3A%22pc_browser_null_0.0.0%22%2C%22cna%22%3A%224Ha%2FHb9%2B8QEBASQJijR52Awl%22%2C%22fromkv%22%3A%22offerdetail%3Apc%3BipvId%3A213e36ab17117929945421320e75bd%22%7D&_fm.smar.755527819845_48b8df3db448c6bad0e847c317886360.m=%7B%22group%22%3A%22d4d7e431d5b30a44df6a8b2e50a58237%22%2C%22cargoKey%22%3A%22755527819845_48b8df3db448c6bad0e847c317886360%22%2C%22quantity%22%3A1%2C%22unitPrice%22%3A%226.33%22%2C%22offerId%22%3A%22755527819845%22%2C%22specId%22%3A%2248b8df3db448c6bad0e847c317886360%22%2C%22tbSkuId%22%3A%225207346876796%22%2C%22hasSkuUmp%22%3A%22false%22%2C%22chooseFreeFreight%22%3A0%2C%22productAmount%22%3A%226.33%22%2C%22discount%22%3A1%2C%22isVirtual%22%3A%220%22%2C%22gift%22%3A%22%22%2C%22cartId%22%3A%22%22%2C%22promotionId%22%3A%22%22%2C%22ext%22%3A%22%7B%5C%22sceneCode%5C%22%3A%5C%22%5C%22%7D%22%2C%22buyerCharge%22%3Afalse%2C%22marketingScene%22%3A%22%22%7D&_fm.sma.d4d7e431d5b30a44df6a8b2e50a58237.g=d4d7e431d5b30a44df6a8b2e50a58237&_fm.sma.d4d7e431d5b30a44df6a8b2e50a58237.f=general&_fm.smartm._0.m=&_fm.smarta._0.ar=350502&_fm.smarta._0.p=350502&_fm.smarta._0.c=350502&_fm.smarta._0.po=362000&_fm.smarta._0.ad=%BD%F0%C1%FA%BD%D6%B5%C0%B9%C5%C1%FA%C2%B7%C3%BD%C8%CB%C7%C52%BA%C5%C8%FD%CE%C4%B9%AB%D4%A2%D2%BB%C2%A5%C6%EB%D4%BD%D6%D0%D7%AA%B2%D6&_fm.smarta._0.t=&_fm.smarta._0.to=&_fm.smarta._0.f=feiyu&_fm.smarta._0.ph=&_fm.smarta._0.m=19959858952&_fm.smarta._0.i=false&_fm.smarta._0.is=true&_fm.smarta._0.a=-1&_fm.smartin.d4d7e431d5b30a44df6a8b2e50a58237.me=%7B%22invoiceFlag%22%3Afalse%2C%22invoiceType%22%3A0%2C%22invoiceMode%22%3A%22%22%2C%22streetAddress%22%3A%22%22%2C%22registerPhone%22%3A%22%22%2C%22bank%22%3A%22%22%2C%22accountId%22%3A%22%22%2C%22companyName%22%3A%22%22%2C%22localInvoiceId%22%3A%22undefined%22%2C%22taxpayerIdentifier%22%3A%22%22%2C%22extParams%22%3A%7B%22email%22%3A%22%22%7D%2C%22group%22%3A%22d4d7e431d5b30a44df6a8b2e50a58237%22%7D&_fm.smartin.d4d7e431d5b30a44df6a8b2e50a58237.i=false&_fm.smarts._0.m=%5B%7B%22group%22%3A%22d4d7e431d5b30a44df6a8b2e50a58237%22%2C%22stepNo%22%3A%221%22%2C%22templateId%22%3A%2230%22%2C%22stepName%22%3A%22%C8%AB%BF%EE%BD%BB%D2%D7%22%2C%22instantPay%22%3A%220%22%2C%22sellerActionName%22%3A%22%22%2C%22buyerPayTimeout%22%3A%220%22%2C%22buyerConfirmTimeout%22%3A%220%22%2C%22needSellerAction%22%3A%220%22%2C%22transferAfterConfirm%22%3A%220%22%2C%22needSellerCallNext%22%3A%220%22%2C%22isStepPayAll%22%3A%220%22%2C%22agreement%22%3A%22%22%2C%22needLogistics%22%3A%221%22%2C%22percent%22%3A%221.0%22%2C%22deliveryPercent%22%3A%221.0%22%2C%22payFee%22%3A%22633%22%2C%22actualPayFee%22%3A%22873%22%2C%22discountFee%22%3A%220%22%2C%22itemDiscountFee%22%3A%220%22%2C%22price%22%3A%220%22%2C%22amount%22%3A%221%22%2C%22postFee%22%3A%220%22%2C%22mergedJsonVar%22%3A%22%22%7D%5D&_fm.r._0.u=140%232w2Dve%2FuzzFMcQo2HiuuFpSanxQgLwMah9FA4xt5yifr2OblcBB8%2FtDVlIZFbEvZcpX14c7HBH%2FAuyTRlaOhIoZWFnLe69cgf%2BoiOnbjo3hqzzn7YQqA3VuzzR8ZiahulFzx2DD3VthqzFrLGXY4U6SxzoObV2EqQG3Y2Ac%2Bx%2BmozFdO2XU%2BobTxzIc7VOg%2FlIXx2Dd6%2F61XrQc12XQzlpg7zPnRVr7uljFo2Aw%2B66G7zFrw2XQ%2B5TjqzWXf3YRLMZ2aMXm";

            Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
            HttpContent content = new StringContent(postData, Encoding.GetEncoding("GB2312"), "application/x-www-form-urlencoded");

            var response = client.PostAsync(url, content).Result;
            return response;
        }

        public PrewOrderResponse PrewOrder(List<PP_OrderProductParamRequest> orderProducts,  OrderModel orderModel, ConsigneeRequest Consignee)
        {
            var flow = orderModel.ToString(); //下单类型
                                              //获取时间戳
            var timestamp = DateTimeOffset.UtcNow.ToUnixTimeSeconds();
            var ipvId = Md5Helper.Md5_32(timestamp.ToString());
            var productParameter = GetProductParameter(orderProducts, orderModel, ipvId);
            var _csrf_token = productParameter.Csrf_token;
            var lvid = productParameter.Lvid;
            var orderUrl = productParameter.OrderUrl;

            var address = Consignee.Province+ Consignee.City+ Consignee.County;

            var adressModel = InputAddress(address, _csrf_token);
            if (adressModel == null)
            {
                return null;
            }
            AddLog?.Invoke($"获取地址信息成功,姓名:{adressModel.PersonalName},手机号:{adressModel.MobileNO},地址:{adressModel.AddressDetail},邮编:{adressModel.DivisionZip}");

            var addressCode = adressModel.AddressCode;

            adressModel.PersonalName = Consignee.ContactName;
            adressModel.MobileNO= Consignee.Mobile;

            adressModel.AddressDetail = Consignee.Town+ Consignee.Address;
            var divisionZip = adressModel.DivisionZip;
            //刷新地址
            productParameter = ReflashAdress(productParameter, adressModel, orderModel);



            return new PrewOrderResponse
            {
                AddressModel = adressModel,
                orderParameter = productParameter,
                OrderModel = orderModel,
                ActualPay = productParameter.OrderGroupParameterList.Select(s => s.ActualPay).Sum(),
                SumCarriage = productParameter.OrderGroupParameterList.Select(s => s.SumCarriage).Sum(),
                TotalProductAmount = productParameter.OrderGroupParameterList.Select(s => s.TotalProductAmount).Sum()
            };
        }
    }
}