using dodohold.core;
using System.Text.Json;

namespace molilian.core
{
    public partial class AlimamaPlus
    {
        private const string base_orders_url = "https://pub.alimama.com/openapi/param2/1/gateway.unionpub/report.getTbkOrderDetails.json";

        public async Task<int> GetHistoryOrdersAsync(int sleep, DateTime startTime, DateTime endTime)
        {
            string lockKey = $"lock:GetHistoryOrders:{_accountId}";

            if (!RedisHelper.Set(lockKey, "1", 1800))
            {
                string message = $"【GetHistoryOrders】【{_accountId}:{_accountName}】任务正在执行中，跳过本次调用";
                _ = new LoggerLibrary("task_lock", "skip")
                    .Info(message)
                    .SaveAsync();
                return 0;
            }

            var startTimestamp = DateTime.Now;
            try
            {
                //DateTime endTime = DateTime.Now;
                //DateTime startTime = endTime.AddDays(-90);
                //if (_accountId == 3) endTime = DateTime.Parse("2024-04-07");
                //#if DEBUG

                //            startTime = DateTime.Parse("2024-05-01");
                //            endTime = DateTime.Parse("2024-06-01");


                //            int total = 0;

                //            List<DateTime> orderTimes = new List<DateTime>();

                //            for (DateTime date = startTime; date <= endTime; date = date.AddDays(1))
                //            {
                //                orderTimes.Add(date);
                //            }


                //#else

                //#endif       

                //当日往前查询
                (int total, DateTime max_modifiedTime, List<DateTime> orderTimes) = await GetTkOrdersAsync(startTime, endTime, DateTime.MinValue, false, sleep);

                if (_account.is_hide) return total;

                string sql = @"
UPDATE tk_report tr
JOIN (
    SELECT
        accountId, DATE(tbPaidTime) AS date, SUM(alipayTotalPrice) AS order_ord_amt,
        COUNT(*) AS order_ord_num, SUM(pubShareFeeForCommission) AS order_ord_tfee
    FROM tk_order_details
    WHERE DATE(tbPaidTime) IN @orderTimes AND tkStatus=3 AND accountId=@accountId
    GROUP BY DATE(tbPaidTime), accountId
) AS sub
ON tr.accountId = sub.accountId AND tr.report_date = sub.date
SET tr.order_ord_amt = sub.order_ord_amt, tr.order_ord_num_3 = sub.order_ord_num, 
    tr.order_ord_tfee = sub.order_ord_tfee;";
                DBContext.Execute(sql, new { accountId = _accountId, orderTimes });

                sql = @"
UPDATE tk_report tr
JOIN (
    SELECT
        accountId, DATE(tbPaidTime) AS date, SUM(alipayTotalPrice) AS order_ord_amt, 
        COUNT(*) AS order_ord_num, SUM(pubSharePreFeeForCommission) AS order_ord_tfee
    FROM tk_order_details
    WHERE DATE(tbPaidTime) IN @orderTimes AND tkStatus=12 AND accountId=@accountId
    GROUP BY DATE(tbPaidTime), accountId
) AS sub
ON tr.accountId = sub.accountId AND tr.report_date = sub.date
SET tr.order_ord_amt_12 = sub.order_ord_amt, tr.order_ord_num_12 = sub.order_ord_num, 
    tr.order_ord_tfee_12 = sub.order_ord_tfee;";
                DBContext.Execute(sql, new { accountId = _accountId, orderTimes });

                sql = @"
UPDATE tk_report tr
JOIN (
    SELECT
        accountId, DATE(tbPaidTime) AS date, SUM(alipayTotalPrice) AS order_ord_amt, 
        COUNT(*) AS order_ord_num, SUM(pubSharePreFeeForCommission) AS order_ord_tfee
    FROM tk_order_details
    WHERE DATE(tbPaidTime) IN @orderTimes AND tkStatus=13 AND accountId=@accountId
    GROUP BY DATE(tbPaidTime), accountId
) AS sub
ON tr.accountId = sub.accountId AND tr.report_date = sub.date
SET tr.order_ord_amt_13 = sub.order_ord_amt, tr.order_ord_num_13 = sub.order_ord_num, 
    tr.order_ord_tfee_13 = sub.order_ord_tfee;";
                DBContext.Execute(sql, new { accountId = _accountId, orderTimes });

                sql = @"
UPDATE tk_report tr
JOIN (
    SELECT
        accountId, DATE(tbPaidTime) AS date, SUM(alipayTotalPrice) AS order_ord_amt, 
        COUNT(*) AS order_ord_num, SUM(pubSharePreFeeForCommission) AS order_ord_tfee
    FROM tk_order_details
    WHERE DATE(tbPaidTime) IN @orderTimes AND tkStatus=14 AND accountId=@accountId
    GROUP BY DATE(tbPaidTime), accountId
) AS sub
ON tr.accountId = sub.accountId AND tr.report_date = sub.date
SET tr.order_ord_amt_14 = sub.order_ord_amt, tr.order_ord_num_14 = sub.order_ord_num, 
    tr.order_ord_tfee_14 = sub.order_ord_tfee;";
                DBContext.Execute(sql, new { accountId = _accountId, orderTimes });

                sql = @"UPDATE tk_report 
SET  order_ord_num = order_ord_num_3 + order_ord_num_12 + order_ord_num_13 + order_ord_num_14
 WHERE DATE(report_date) IN @orderTimes AND accountId=@accountId;";
                DBContext.Execute(sql, new { accountId = _accountId, orderTimes });

                return total;
            }
            catch (Exception ex)
            {
                string errorMessage = $"【GetHistoryOrders】【{_accountId}:{_accountName}】执行异常: {ex.Message}";
                _ = new LoggerLibrary("task_error", "GetHistoryOrders")
                    .Info(errorMessage, ex.StackTrace)
                    .SaveAsync();
                throw;
            }
            finally
            {
                var executionTime = DateTime.Now - startTimestamp;
                string logMessage = $"【GetHistoryOrders】【{_accountId}:{_accountName}】执行完成，耗时: {executionTime.TotalSeconds:F2}秒";
                _ = new LoggerLibrary("task_performance", "GetHistoryOrders")
                    .Info(logMessage)
                    .SaveAsync();

                RedisHelper.Del(lockKey);
            }

        }
        public async Task<int> GetIncyOrdersAsync(int sleep, int retry_days = 0)
        {
            string lockKey = $"lock:GetIncyOrders:{_accountId}";

            if (!RedisHelper.Set(lockKey, "1", 1800))
            {
                string message = $"【GetIncyOrders】【{_accountId}:{_accountName}】任务正在执行中，跳过本次调用";
                _ = new LoggerLibrary("task_lock", "skip")
                    .Info(message)
                    .SaveAsync();
                return 0;
            }

            var startTimestamp = DateTime.Now;
            try
            {
                string cacheKey = $":cache:GetIncyOrders:{_accountName}";
                string cacheKey2 = $":cache:GetIncyOrders:{_accountId}";
                DateTime endTime = DateTime.Now;
                DateTime startTime = endTime.AddDays(-1);

                DateTime last_modifiedTime = RedisHelper.Get<DateTime>(cacheKey);
                ////找出数据库最新的一天
                //var last = new DBContext.Table("tk_order_details")
                //     .Order("modifiedTime DESC")
                //     .Get<TkOrderDetailDTO>("accountId=@accountId", new { accountId = _accountId });


                if (last_modifiedTime != DateTime.MinValue)
                {
                    startTime = last_modifiedTime;
                }
                else
                {
                    last_modifiedTime = startTime;
                }
                if (retry_days > 0)
                {
                    last_modifiedTime = DateTime.Now.AddDays(-retry_days);
                }
                //当日往前查询
                (int total, DateTime max_modifiedTime, List<DateTime> orderTimes) = await GetTkOrdersAsync(startTime, endTime, last_modifiedTime, true, sleep);
                if (max_modifiedTime != DateTime.MinValue)
                {
                    RedisHelper.Set(cacheKey, max_modifiedTime);
                    RedisHelper.Set(cacheKey2, max_modifiedTime);
                }
                if (_account.is_hide) return total;
                if (total == 0) return 0;

                //todo 根据orderTimes、settlementTimes 更新被影响的相关行 

                string sql = @"
UPDATE tk_report tr
JOIN (
    SELECT
        accountId, DATE(tbPaidTime) AS date, SUM(alipayTotalPrice) AS order_ord_amt,
        COUNT(*) AS order_ord_num, SUM(pubShareFeeForCommission) AS order_ord_tfee
    FROM tk_order_details
    WHERE DATE(tbPaidTime) IN @orderTimes AND tkStatus=3 AND accountId=@accountId
    GROUP BY DATE(tbPaidTime), accountId
) AS sub
ON tr.accountId = sub.accountId AND tr.report_date = sub.date
SET tr.order_ord_amt = sub.order_ord_amt, tr.order_ord_num_3 = sub.order_ord_num, 
    tr.order_ord_tfee = sub.order_ord_tfee;";
                int x = DBContext.Execute(sql, new { accountId = _accountId, orderTimes });

                sql = @"
UPDATE tk_report tr
JOIN (
    SELECT
        accountId, DATE(tbPaidTime) AS date, SUM(alipayTotalPrice) AS order_ord_amt, 
        COUNT(*) AS order_ord_num, SUM(pubSharePreFeeForCommission) AS order_ord_tfee
    FROM tk_order_details
    WHERE DATE(tbPaidTime) IN @orderTimes AND tkStatus=12 AND accountId=@accountId
    GROUP BY DATE(tbPaidTime), accountId
) AS sub
ON tr.accountId = sub.accountId AND tr.report_date = sub.date
SET tr.order_ord_amt_12 = sub.order_ord_amt, tr.order_ord_num_12 = sub.order_ord_num, 
    tr.order_ord_tfee_12 = sub.order_ord_tfee;";
                DBContext.Execute(sql, new { accountId = _accountId, orderTimes });

                sql = @"
UPDATE tk_report tr
JOIN (
    SELECT
        accountId, DATE(tbPaidTime) AS date, SUM(alipayTotalPrice) AS order_ord_amt, 
        COUNT(*) AS order_ord_num, SUM(pubSharePreFeeForCommission) AS order_ord_tfee
    FROM tk_order_details
    WHERE DATE(tbPaidTime) IN @orderTimes AND tkStatus=13 AND accountId=@accountId
    GROUP BY DATE(tbPaidTime), accountId
) AS sub
ON tr.accountId = sub.accountId AND tr.report_date = sub.date
SET tr.order_ord_amt_13 = sub.order_ord_amt, tr.order_ord_num_13 = sub.order_ord_num, 
    tr.order_ord_tfee_13 = sub.order_ord_tfee;";
                DBContext.Execute(sql, new { accountId = _accountId, orderTimes });

                sql = @"
UPDATE tk_report tr
JOIN (
    SELECT
        accountId, DATE(tbPaidTime) AS date, SUM(alipayTotalPrice) AS order_ord_amt, 
        COUNT(*) AS order_ord_num, SUM(pubSharePreFeeForCommission) AS order_ord_tfee
    FROM tk_order_details
    WHERE DATE(tbPaidTime) IN @orderTimes AND tkStatus=14 AND accountId=@accountId
    GROUP BY DATE(tbPaidTime), accountId
) AS sub
ON tr.accountId = sub.accountId AND tr.report_date = sub.date
SET tr.order_ord_amt_14 = sub.order_ord_amt, tr.order_ord_num_14 = sub.order_ord_num, 
    tr.order_ord_tfee_14 = sub.order_ord_tfee;";
                DBContext.Execute(sql, new { accountId = _accountId, orderTimes });

                sql = @"UPDATE tk_report 
SET  order_ord_num = order_ord_num_3 + order_ord_num_12 + order_ord_num_13 + order_ord_num_14
 WHERE DATE(report_date) IN @orderTimes AND accountId=@accountId;";
                DBContext.Execute(sql, new { accountId = _accountId, orderTimes });

                return total;
            }
            catch (Exception ex)
            {
                string errorMessage = $"【GetIncyOrders】【{_accountId}:{_accountName}】执行异常: {ex.Message}";
                _ = new LoggerLibrary("task_error", "GetIncyOrders")
                    .Info(errorMessage, ex.StackTrace)
                    .SaveAsync();
                throw;
            }
            finally
            {
                var executionTime = DateTime.Now - startTimestamp;
                string logMessage = $"【GetIncyOrders】【{_accountId}:{_accountName}】执行完成，耗时: {executionTime.TotalSeconds:F2}秒";
                _ = new LoggerLibrary("task_performance", "GetIncyOrders")
                    .Info(logMessage)
                    .SaveAsync();

                RedisHelper.Del(lockKey);
            }
        }

        public async Task<int> GetOrdersByAdZoneAsync(long adzoneId, DateTime startTime, DateTime endTime, int sleep)
        {
            string cacheKey = $":cache:GetOrdersByAdZone:{_accountName}";
            string cacheKey2 = $":cache:GetOrdersByAdZone:{_accountId}";

            DateTime last_modifiedTime = RedisHelper.Get<DateTime>(cacheKey);

            if (last_modifiedTime != DateTime.MinValue)
            {
                startTime = last_modifiedTime;
            }
            else
            {
                last_modifiedTime = startTime;
            }

            //当日往前查询
            (int total, DateTime max_modifiedTime, List<DateTime> orderTimes) = await GetTkOrdersByAdZoneAsync(adzoneId, startTime, endTime, last_modifiedTime, true, sleep);
            if (max_modifiedTime != DateTime.MinValue)
            {
                RedisHelper.Set(cacheKey, max_modifiedTime);
                RedisHelper.Set(cacheKey2, max_modifiedTime);
            }

            return total;
        }
        public async Task<(int, DateTime, List<DateTime>)> GetTkOrdersByAdZoneAsync(long adzoneId, DateTime startTime, DateTime endTime, DateTime last_modifiedTime, bool desc = true, int sleep = 100)
        {
            List<DateTime> orderTimes = [];

            if (startTime > endTime)
            {
                (startTime, endTime) = (endTime, startTime);
            }

            DateTime max_modifiedTime = last_modifiedTime;

            int pageNo = 1;
            string positionIndex = string.Empty;
            int pageSize = 100;

            bool hasNext = true;
            int total = 0;
            while (hasNext)
            {
                var ts = DateTime.Now.Convert2UnixTimestamp(true);
                string jumpType = pageNo == 1 ? "0" : "1";

#if DEBUG
                jumpType = pageNo == 1 ? "0" : "1";


#endif
                string queryType = desc ? "4" : "2";

                string url = $"{base_orders_url}?t={ts}&_tb_token_={_tb_token}&pageNo={pageNo}&pageSize={pageSize}&startTime={startTime:yyyy-MM-dd}&endTime={endTime:yyyy-MM-dd}&payStatus=&queryType={queryType}&jumpType={jumpType}&positionIndex={positionIndex.UrlEncode()}";
                string body = "";

                JsonElement data;
                try
                {
                    var client = new WebClientUtility().SetContentType("application/x-www-form-urlencoded; charset=UTF-8")
                          .AddHeaders("X-Requested-With", "XMLHttpRequest")
                          .AddHeaders("Cookie", _cookies);
#if DEBUG
#else
                        client.Proxy = _proxy;
#endif
                    if (!string.IsNullOrEmpty(_user_agent)) client.UserAgent = _user_agent;
                    var response = client.Request(url);

                    if (response.ResponseException != null)
                    {
                        _ = new LoggerLibrary("api_error", "fail")
                            .Info(response.ResponseException.Message, response.ResponseException.StackTrace)
                            .SaveAsync();
                        throw response.ResponseException;
                    }
                    body = response.Body();
#if DEBUG
                    _ = new LoggerLibrary("debug", "GetTkOrdersByAdZone")
                        .Info(body)
                        .SaveAsync();
#endif
                    if (body.Contains("{\"action\":\"captcha\""))
                    {
                        RiskControlCore.SetRiskCookie($"tb:{_accountId}", "滑块");
                        string message = $"【GetTkOrdersByAdZone】【{_accountId}:{_accountName}】出现滑动验证码";
                        //NotifyCore.Notify(new NifyMessage
                        //{
                        //    message = message,
                        //    priority = NifyMessagePriority.high,
                        //    tags = ["red_circle"]
                        //});
                        if (!_account.is_hide)
                        {
                            _ = NotifyCore.QYWeixinPushNotifyAsync(message, message);
                        }
                        throw new Exception(message);
                    }

                    if (body.Contains("\"resultCode\":500"))
                    {
                        string message = $"【GetTkOrdersByAdZone】【{_accountId}:{_accountName}】出现错误\n{body}";
                        NotifyCore.Notify(new NifyMessage
                        {
                            message = message,
                            priority = NifyMessagePriority.high,
                            tags = ["red_circle"]
                        });
                        throw new Exception(message);
                    }
                    var root = body.Convert2JsonElement();
                    var success = root.Read<bool>("success");
                    data = root.ElementRead("data");

                    if (!success && body.Contains("nologin"))
                    {
                        (success, string message) = RenewCookie();
                        if (!success)
                        {
                            TkPoolCore.Disabled(_accountId, _accountName, $"{body}", _account.is_hide);
                        }
                        return (0, DateTime.MinValue, new List<DateTime>());
                    }

                    if (!success)
                    {
                        throw new APIException(body);
                    }
                }
                catch (Exception ex)
                {
                    throw new APIException(body);
                }
                using var conn = DBContext.GetOpenConnection();
                conn.Open();

                try
                {
                    foreach (var order in data.ElementRead("result").EnumerateArray())
                    {
                        TkOrderDetailAdZoneDTO item = order.GetRawText().Convert2Object<TkOrderDetailAdZoneDTO>();
                        // 处理每个订单数据 
                        if (item.adzoneId != adzoneId) continue;

                        item.accountId = _accountId;
                        item.accountName = _company;

                        if (item.modifiedTime > max_modifiedTime) max_modifiedTime = item.modifiedTime;

                        if (last_modifiedTime != DateTime.MinValue && last_modifiedTime >= item.modifiedTime)
                        {
                            return (total, max_modifiedTime, orderTimes);
                        }

                        if (item.tkStatus == 3 && item.tbPaidTime != DateTime.MinValue) orderTimes.Add(item.tbPaidTime.Date);
                        int? id = conn.Replace(item);

                        total++;
                    }
                }
                catch (Exception ex)
                {
                    throw;
                }
                finally
                {
                    conn.Dispose();
                }
                pageNo++;
                hasNext = data.Read<bool>("hasNext");
                positionIndex = data.Read<string>("positionIndex");

                if (sleep > 0) await Task.Delay(sleep);
            }
            return (total, max_modifiedTime, orderTimes);
        }


        public async Task<(int, DateTime, List<DateTime>)> GetTkOrdersAsync(DateTime startTime, DateTime endTime, DateTime last_modifiedTime, bool desc = true, int sleep = 100)
        {
            List<DateTime> orderTimes = [];

            // 确保 startTime 小于 endTime
            if (startTime > endTime)
            {
                (startTime, endTime) = (endTime, startTime);
            }

            DateTime max_modifiedTime = last_modifiedTime;

            int pageNo = 1;
            string positionIndex = string.Empty;
            int pageSize = 100;

            bool hasNext = true;
            int total = 0;
            while (hasNext)
            {
                var ts = DateTime.Now.Convert2UnixTimestamp(true);
                //string jumpType = desc ? pageNo == 1 ? "0" : "1" : "-1";
                string jumpType = pageNo == 1 ? "0" : "1";

#if DEBUG
                jumpType = pageNo == 1 ? "0" : "1";


#endif
                //string queryType = "1";
                //1 创建时间；3结算时间 2付款时间 4更新时间
                //string queryType = "2";
                string queryType = desc ? "4" : "2";

                string url = $"{base_orders_url}?t={ts}&_tb_token_={_tb_token}&pageNo={pageNo}&pageSize={pageSize}&startTime={startTime:yyyy-MM-dd}&endTime={endTime:yyyy-MM-dd}&payStatus=&queryType={queryType}&jumpType={jumpType}&positionIndex={positionIndex.UrlEncode()}";

                string body = "";

                JsonElement data;
                try
                {
                    bool success = false;
#if DEBUG
                    _cookies = "t_alimama=265947ef5452cb1dbc3a85423cb0b4ac; xlly_s=1; wk_cookie2=153667c5e7c346da3c64cc8be5db65b5; wk_unb=UUpjNmHYrAUDFe1XcQ%3D%3D; arms_uid=50fb4ec1-5342-4774-9b30-822cfb71ac29; cookie2_alimama=1939cd118da29bee099e20497d91d195; lid=tb464407448627; cookie3_bak=17c2085f3ca7b7e1d9932184a321265b; env_bak=FM%2BgwZ4N3DW5Nit1vtAN%2BnGo%2FlvOs%2BhcfJ4%2F0uUixKyv; cookie3_bak_exp=1753443569194; havana_lgc_exp=1786690298961; dnk=tb464407448627; tracknick=tb464407448627; lgc=; cookie2=17c2085f3ca7b7e1d9932184a321265b; cancelledSubSites=empty; t=b0f1900bb872fb73431103fd9fd685da; sn=; _tb_token_=e3be75e77317e; uc1=cookie14=UoYbzibV4BRygw%3D%3D&pas=0&cookie16=WqG3DMC9UpAPBHGz5QBErFxlCA%3D%3D&existShop=false&cookie15=WqG3DMC9VAQiUQ%3D%3D&cookie21=V32FPkk%2FhSt4; sgcookie=E100maFa2uGfFmlaN000MHH4oUxgMX%2Fe%2FWHW96Um0swftox2LuxNNHviK0VTqoHo%2F1NuX%2BYAGoSBwA8mzA3bTrtPkhdwXGBaIPytPt3iO9Ay%2Bh8%3D; csg=8a980a9f; login=; rurl=aHR0cHM6Ly9wdWIuYWxpbWFtYS5jb20vaW5kZXguaHRtP2ZvcndhcmQ9aHR0cHMlM0ElMkYlMkZwdWIuYWxpbWFtYS5jb20lMkZwb3J0YWwlMkZ2MiUyRmVmZmVjdCUyRm9yZGVyJTJGb3ZlcnZpZXdPcmRlciUyRnBhZ2UlMkZpbmRleC5odG0%3D; v_alimama=0; JSESSIONID=5529D2F4B4C1D00E84AEBD50280FB383; cna=BfkxIaeXgCYCAXs5yWAuAa9d; x5sec=7b22733b32223a2263613337363636363063313961373062222c2277616762726964676561643b32223a2232643831656432356532633264343332333737306462646238363761376562664350476374385547454a612f707654392f2f2f2f2f774561454449794d6a41794e544d314d5445314e446b374d545977332f6e4f3651553d227d; tfstk=gEftPuYb-kqMTmoZWi2noACNV9Uh0JbN8G7SinxihMIduaU2hRS0MsIcvPJbbCfAvZSeoj2NmMHXkHWGnrzwDEtCYEf07KjdDaIJoxXg7msFkg6MoCODMmdNtOcDjlRAlgAYquVuZN7wMIZuq5jhO1dWrcMsmnOCRIYvWC9CtN7wg2unc8XC7qEntGc6lnapOELocIT6lBapkUKXGh9jAvTWAnOfcn_BOF8r5FTsGXapuHT6GIsfRyLDAnOXGi_ITUU9YVTtMOE1kwEYa-WPI6L9B3_LUbczeTol8NGsajfdp4xR5xljG6L9B6M24HxwIt_yU1bUMXRGy9OBWiN7fpW1JspPg-cMQ9_hwe17oY-h9hjf6paowKACZLO1KJrMnCLRc1StkjsXshOG1IumgaO9ACf9pqGAVwbl_p5Y2DtVIURBWiN7vgWFZ_L570xJoAaLJxk2CezoM3hD13hyWeKu5dMq3KYeJ34LJxk2Ce8pqPGj3xJD8";
#endif
                    var client = new WebClientUtility().SetContentType("application/x-www-form-urlencoded; charset=UTF-8")
                          .AddHeaders("X-Requested-With", "XMLHttpRequest")
                          .AddHeaders("Cookie", _cookies);
#if DEBUG
#else
                        client.Proxy = _proxy;
#endif
                    if (!string.IsNullOrEmpty(_user_agent)) client.UserAgent = _user_agent;
                    client.Referer = "https://pub.alimama.com/portal/v2/effect/order/overviewOrder/page/index.htm";
                    var response = client.Request(url);

                    if (response.ResponseException != null)
                    {
                        _ = new LoggerLibrary("api_error", "fail")
                            .Info(response.ResponseException.Message, response.ResponseException.StackTrace)
                            .SaveAsync();
                        throw response.ResponseException;
                    }
                    body = response.Body();
                    _ = new LoggerLibrary("debug", "GetTkOrders")
                        .Info(body)
                        .SaveAsync();


                    if (body.Contains("{\"action\":\"login\"") || body.Contains("\"action\": \"login\""))
                    {
                        (success, string message) = RenewCookie();
                        if (!success)
                        {
                            TkPoolCore.Disabled(_accountId, _accountName, $"{body}", _account.is_hide);
                        }
                        return (0, DateTime.MinValue, new List<DateTime>());
                    }


                    if (body.Contains("{\"action\":\"captcha\""))
                    {
                        RiskControlCore.SetRiskCookie($"tb:{_accountId}", "滑块");
                        string message = $"【GetTkOrders】【{_accountId}:{_accountName}】出现滑动验证码";
                        //NotifyCore.Notify(new NifyMessage
                        //{
                        //    message = message,
                        //    priority = NifyMessagePriority.high,
                        //    tags = ["red_circle"]
                        //});
                        if (!_account.is_hide)
                        {
                            _ = NotifyCore.QYWeixinPushNotifyAsync(message, message);
                        }
                        return (0, max_modifiedTime, new List<DateTime>());
                        //throw new Exception(message);
                    }

                    if (body.Contains("\"resultCode\":500"))
                    {
                        //{"success":false,"resultCode":500,"bizErrorDesc":"系统繁忙，请稍后重试！","bizErrorCode":3001}

                        string message = $"【GetTkOrders】【{_accountId}:{_accountName}】出现错误\n{body}";
                        NotifyCore.Notify(new NifyMessage
                        {
                            message = message,
                            priority = NifyMessagePriority.high,
                            tags = ["red_circle"]
                        });
                        throw new Exception(message);
                    }

                    /*
<script>sessionStorage.x5referer = window.location.href;var url = window.location.protocol + "//pub.alimama.com//openapi/param2/1/gateway.unionpub/report.getTbkOrderDetails.json/_____tmd_____/punish?x5secdata=xc1iwR0XfHknuQ2tGhtadtTAvEt14YScfTDHt2ZiSRqroaYZK98uykgsVOy7o75Rw8uuycKT3Rpx30%2fB5H0gRc0%2fJVGQUcV5g%2fsAmZ%2bc46eyD7DXSdA4R3mLnmtbp9wuZ1vmrG3ZPlH7brUilFbXBdZ7EBrru1X7wPfC05Eq3g4mhDFiGq39xUtwQcC%2f%2bPbtekcm8%2fVJ%2brVt8aExunwzXzJPJJTAvEt14YScfTDHt2ZiSRqroaYZK98uykgsiXIkw%2ffMWwebJ3zxCja5CzSu%2ffTA%3d%3d__bx__pub.alimama.com%2fopenapi%2fparam2%2f1%2fgateway.unionpub%2freport.getTbkOrderDetails.json&x5step=1";window.location.replace(url);window._config_ = {"action":"captcha","url":"https://pub.alimama.com//openapi/param2/1/gateway.unionpub/report.getTbkOrderDetails.json/_____tmd_____/punish?x5secdata=xc1iwR0XfHknuQ2tGhtadtTAvEt14YScfTDHt2ZiSRqroaYZK98uykgsVOy7o75Rw8uuycKT3Rpx30%2fB5H0gRc0%2fJVGQUcV5g%2fsAmZ%2bc46eyD7DXSdA4R3mLnmtbp9wuZ1vmrG3ZPlH7brUilFbXBdZ7EBrru1X7wPfC05Eq3g4mhDFiGq39xUtwQcC%2f%2bPbtekcm8%2fVJ%2brVt8aExunwzXzJPJJTAvEt14YScfTDHt2ZiSRqroaYZK98uykgsiXIkw%2ffMWwebJ3zxCja5CzSu%2ffTA%3d%3d__bx__pub.alimama.com%2fopenapi%2fparam2%2f1%2fgateway.unionpub%2freport.getTbkOrderDetails.json&x5step=1"};</script><!--rgv587_flag:sm-->                     */
                    var root = body.Convert2JsonElement();
                    success = root.Read<bool>("success");
                    data = root.ElementRead("data");


                    //{"code":601,"info":{"ok":false,"message":"nologin"}}
                    if (!success && body.Contains("nologin"))
                    {
                        (success, string message) = RenewCookie();
                        if (!success)
                        {
                            TkPoolCore.Disabled(_accountId, _accountName, $"{body}", _account.is_hide);
                        }
                        return (0, DateTime.MinValue, new List<DateTime>());
                    }

                    if (!success)
                    {
                        throw new APIException(body);
                    }
                }
                catch (Exception ex)
                {
                    _ = new LoggerLibrary("debug", "GetTkOrders")
                        .Info(body)
                        .Info(ex.Message, ex.StackTrace)
                        .SaveAsync();


                    string message = $"【GetRawItemId】{_accountId}:{_accountName}\t{_proxy?.Address}\n" +
                        $"{body}\n{ex.Message}\n{ex.StackTrace}";

                    if (sleep > 0) await Task.Delay(sleep);
                    throw new APIException(body);
                }
                try
                {

                    foreach (var order in data.ElementRead("result").EnumerateArray())
                    {
                        TkOrderDetailDTO item = order.GetRawText().Convert2Object<TkOrderDetailDTO>();
                        // 处理每个订单数据 

                        item.accountId = _accountId;
                        item.accountName = _company;

                        if (item.modifiedTime > max_modifiedTime) max_modifiedTime = item.modifiedTime;

                        if (last_modifiedTime != DateTime.MinValue && last_modifiedTime >= item.modifiedTime)
                        {
                            return (total, max_modifiedTime, orderTimes);
                        }

                        //进行订单和转链匹配
                        (int state, item.itemId) = GetRawItemId(item.mktId);
                        if (item.tkStatus == 3 && item.tbPaidTime != DateTime.MinValue) orderTimes.Add(item.tbPaidTime.Date);
                        using var conn = DBContext.GetOpenConnection();
                        int? id = conn.Replace(item);
                        if (id != null)
                        {
                            item.id = (int)id;
                            TkOrderTrackingCore.MatchOrder(_account, item);
                        }
                        total++;
                    }
                }
                catch (Exception ex)
                {
                    if (sleep > 0) await Task.Delay(sleep);
                    throw;
                }
                pageNo++;
                hasNext = data.Read<bool>("hasNext");
                positionIndex = data.Read<string>("positionIndex");

                if (sleep > 0) await Task.Delay(sleep);
            }
            return (total, max_modifiedTime, orderTimes);
        }
        public (int, string) GetRawItemId(string mktId)
        {
            ////
            ///
            string body = string.Empty, location = string.Empty;
            var proxy = ProxyNodesCore.RandomOne();
            try
            {
                string cacheKey = $":cache:mkt2itemId:{mktId}";

                string itemId = RedisHelper.Get(cacheKey);
                if (itemId != null) return (1, itemId);

                string mktItemLink = $"https://uland.taobao.com/item/edetail?id={mktId}";
                ////uland.taobao.com/item/edetail?id=98t7UOZmNWX4dh2eJSQt6-b7Y8yZVuBQ5ywoz7TDA
                ////uland.taobao.com/item/edetail?id=98t7UOZmNWX4dh2eJSQt6-b7Y8yZVuBQ5ywoz7TD
                ///
                var client = new WebClientUtility();
                client.Proxy = proxy;
                client.AddHeaders("accept-language", "zh-CN,zh;q=0.9");
                client.AllowAutoRedirect = false;
                var response = client.Request(mktItemLink);
                if (!response.Successed)
                {
                    throw response.ResponseException;
                }

                location = response.ResponseMessage?.Headers?.Location?.ToString();
                string message;
                if (!string.IsNullOrEmpty(location) && location.Contains("err.taobao.com/error1.html"))
                {
                    message = $"【GetRawItemId】{_accountId}:{_accountName}\t{proxy?.Address}\n" +
                       $"{mktId}\n{location}";

                    //NotifyCore.Notify(new NifyMessage
                    //{
                    //    message = message,
                    //    priority = NifyMessagePriority.high,
                    //    tags = ["red_circle"]
                    //});
                    return (0, null);
                }

                if (!string.IsNullOrEmpty(location) && location.Contains("item.htm?id="))
                {
                    itemId = location.GetContentPart("?id=", "");
                }

                if (!string.IsNullOrEmpty(itemId))
                {
                    RedisHelper.Set(cacheKey, itemId, 86400 * 7);
                }
                else
                {
                }
                return (1, itemId);
            }
            catch (Exception ex)
            {
                string message = $"【GetRawItemId】{_accountId}:{_accountName}\t{proxy?.Address}\n" +
                    $"{mktId}\n{location}\n{body}\n{ex.Message}";

                NotifyCore.Notify(new NifyMessage
                {
                    message = message,
                    priority = NifyMessagePriority.high,
                    tags = ["red_circle"]
                });
            }
            return (0, null);
        }




        public (int, string) GetRawItemId22(string mktId)
        {
            string body = string.Empty, location = string.Empty;
            try
            {
                string lock_key = $"lock:GetRawItemId:disabled";
                int count = RedisHelper.Get<int>(lock_key);
                if (count > 0) return (0, null);

                string cacheKey = $":cache:mkt2itemId:{mktId}";

                string itemId = RedisHelper.Get(cacheKey);
                if (itemId != null) return (1, itemId);


                var ts = DateTime.Now.Convert2UnixTimestamp(true);
                string url = "https://pub.alimama.com/openapi/param2/1/gateway.unionpub/union.moose.content.entry";

                //string url = $"{base_orders_url}?t={ts}&_tb_token_={_tb_token}&pageNo={pageNo}&pageSize={pageSize}&startTime={startTime:yyyy-MM-dd}&endTime={endTime:yyyy-MM-dd}&payStatus=&queryType={queryType}&jumpType={jumpType}&tkTradeId=&positionIndex={positionIndex}";

                var client = new WebClientUtility()
                    .SetContentType("application/x-www-form-urlencoded")
                    .AddHeaders("Cookie", _cookies)
                    .AddHeaders("Origin", "https://pub.alimama.com")
                    .Post("_tb_token_", _tb_token)
                    .Post("t", ts.ToString())
                    .Post("bizType", "detailPage")
                    .Post("bizParam", $"{{\"itemId\":\"{mktId}\"}}");
                //_tb_token_=3b88755bbe3f7&t=1718896771391&bizType=detailPage&bizParam=%7B%22itemId%22%3A%22JbtMUqkGMQvagTNb2Fvta-9ag242pu7MOX5e0bsrY%22%7D
                //_tb_token_=361e383eb61e5&t=1718895935097&bizType=detailPage&bizParam=%7B%22itemId%22%3A%22JbtMUqkGMQvagTNb2Fvta-9ag242pu7MOX5e0bsrY%22%7D


#if DEBUG
#else
                client.Proxy = _proxy;
#endif
                if (!string.IsNullOrEmpty(_user_agent)) client.UserAgent = _user_agent;
                var response = client.Request(url);
                if (!response.Successed)
                {
                    throw response.ResponseException;
                }

                location = response.ResponseMessage?.Headers?.Location?.ToString();
                string message;
                if (!string.IsNullOrEmpty(location) && location.Contains("err.taobao.com/error1.html"))
                {
                    RedisHelper.Set(lock_key, 1, 60);

                    message = $"【GetRawItemId】{_accountId}:{_accountName}\t{_proxy?.Address}\n" +
                       $"{mktId}\n{location}";

                    //NotifyCore.Notify(new NifyMessage
                    //{
                    //    message = message,
                    //    priority = NifyMessagePriority.high,
                    //    tags = ["red_circle"]
                    //});
                    return (0, null);
                }

                body = response.Body();
                var root = body.Convert2JsonElement();

                int code = root.PathRead<int>("code");
                message = root.PathRead<string>("info.message");

                //if ("nologin".Equals(message))
                //{
                //    (bool success, message) = RenewCookie();
                //    if (!success)
                //    {
                //        TkPoolCore.Disabled(_accountId, _accountName, body);
                //        throw new Exception("nologin");
                //    }
                //    return (-1, null);
                //}

                itemId = root.PathRead<string>("model.item.itemId");
                if (!string.IsNullOrEmpty(itemId))
                {
                    RedisHelper.Set(cacheKey, itemId, 86400 * 7);
                }
                else
                {
                    //RedisHelper.Set(lock_key, 1, 3600);
                }
                return (1, itemId);
            }
            catch (Exception ex)
            {
                string message = $"【GetRawItemId】{_accountId}:{_accountName}\t{_proxy?.Address}\n" +
                    $"{mktId}\n{location}\n{body}\n{ex.Message}";

                NotifyCore.Notify(new NifyMessage
                {
                    message = message,
                    priority = NifyMessagePriority.high,
                    tags = ["red_circle"]
                });
            }
            return (0, null);
        }


        public void GetTkOrders222()
        {
            try
            {
                string url = "https://media.alimama.com/violationu2/warning_instance_page_v2.json?r=mx_208&toPage=1&pageSize=40&params=";
                var client = new WebClientUtility().SetContentType("application/json;charset=utf-8")
                            .AddHeaders("X-Requested-With", "XMLHttpRequest")
                            .AddHeaders("Cookie", _cookies);
                client.Proxy = _proxy;
                if (!string.IsNullOrEmpty(_user_agent)) client.UserAgent = _user_agent;
                var response = client.Request(url);

                var body = response.Body();
                var root = body.Convert2JsonElement();

                int resultCode = root.Read<int>("resultCode", 0);
                int totalCount = root.PathRead<int>("data.totalCount", 0);
                bool success = root.Read("success", false);

                if (!success)
                {
                    _ = new LoggerLibrary("violationu", "warning_error")
                        .Info(url, body)
                        .SaveAsync();
                    throw new Exception(body);
                }
                if (totalCount == 0) return;
                _ = new LoggerLibrary("violationu", "warning").Info(url, body).SaveAsync();

                var list = root.ElementRead("data").ElementRead("result").EnumerateArray();
                foreach (var data in list)
                {
                    var violation_commission = data.PathRead<decimal>("mediaInfo.订单虚假交易违规佣金", 0);
                    new DBContext.Table("alimama_warning")
                        .Fill(data)
                        .Loader<int>("filterRuleId", 0)
                        .Loader<long>("gmtCreate", 0)
                        .Loader<long>("id", 0, "ali_id")
                        .Loader<string>("idStr", string.Empty)
                        .Loader<int>("mediaDimension", 0)
                        .Loader<long>("mediaId", 0)
                        .Loader<int>("mediaInfo.abn_cnt", 0, "abn_cnt")
                        .Add("violation_commission", violation_commission)
                        .Loader<int>("mediaInfo.warning_cnt", 0, "warning_cnt")
                        .Loader<string>("mediaName", string.Empty)
                        .Loader<long>("memberId", 0)

                        .Loader<string>("noticeCategory", string.Empty)
                        .Loader<int>("noticeTemplateId", 0)
                        .Loader<string>("noticeTemplateName", string.Empty)

                        .Loader<string>("orderFile", string.Empty)
                        .Loader<string>("pid", string.Empty)
                        .Loader<int>("punishRuleId", 0)
                        .Loader<string>("riskType", string.Empty)
                        .Loader<string>("roleName", string.Empty)
                        .Loader<string>("ruleLink", string.Empty)
                        .Loader<bool>("showOrderDetail", false)
                        .Loader<int>("status", 0, "ali_status")
                        .Loader<string>("warningText", string.Empty)

                        .Add("accountName", _accountName)
                        .Add("status", true)
                        .Add("create_time", DateTime.Now)
                        .Add("last_time", DateTime.Now)
                        .Create(DBContext.InsertType.REPLACE);
                }
            }
            catch (Exception ex) { }
        }
    }
}
