using dodohold.core;
using Sayaka.Common;


namespace molilian.core
{
    public partial class JdUnionPlus
    {
        public async Task<List<DateTime>> querySpreadEffectData(DateTime startDate, DateTime endDate, CancellationToken cancellationToken = default)
        {
            List<DateTime> changed_dates = new List<DateTime>();

            var ts = DateTime.Now.Convert2UnixTimestamp(true);
            string cookies = _account.cookies;

            string useragent = _account.user_agent;
            if (string.IsNullOrEmpty(useragent)) useragent = ProviderFakeUserAgent.RandomComputer;

            bool hasNext = true;
            int pageNo = 1;
            while (hasNext)
            {
                var args = new
                {
                    funName = "querySpreadEffectData",
                    param = new
                    {
                        startDate = startDate.ToString("yyyy-MM-dd"),
                        endDate = endDate.ToString("yyyy-MM-dd"),
                        mediaId = "",
                        proCont = "",
                        promotionId = "",
                        sourceEmt = "",
                        pageNo,
                        pageSize = 20
                    },
                };

                string data = args.Convert2Json().UrlEncode();
                string url = $"https://api.m.jd.com/api?functionId=union_report&appid=unionpc&loginType=3&body={data}";

                WebClientUtility client = new WebClientUtility();
                client.Proxy = _proxy;
#if DEBUG
                client.Proxy = null;
#endif
                client.SetContentType("application/x-www-form-urlencoded");
                client.AddHeaders("X-Referer-Page", "https://union.jd.com/proManager/index");
                client.AddHeaders("X-Rp-Client", "h5_1.0.0");
                client.AddHeaders("Referer", "https://union.jd.com/");
                client.AddHeaders("Origin", "https://union.jd.com");
                client.UserAgent = useragent;
                client.AddHeaders("Cookie", cookies);
                client.Post($"body={data}");
                DateTime stime = DateTime.Now;
                var response = await client.RequestAsync(url, "POST", cancellationToken);
                TimeSpan ts2 = stime - DateTime.Now;
                string xx = ts2.TotalSeconds.ToString();

                string body = response.Body();
                var root = body.Convert2JsonElement();
                int code = root.Read<int>("code");
                string message = root.Read<string>("message");
                hasNext = root.Read<bool>("hasNext", false);
                pageNo++;


                if (code == 200 && "success".Equals(message))
                {
                    var list = root.ElementRead("result").ElementRead("spreadReportInfoChatList");

                    foreach (var item in list.EnumerateArray())
                    {
                        var report = item.GetRawText().Convert2Object<SpreadReportInfoDTO>();
                        if (report.clickNum == 0 && report.orderNum == 0 &&
                            report.cosFee == 0 && report.finishOrderNum == 0) continue;

                        if (DateTime.TryParse(report.accountDate, out DateTime report_date))
                        {
                            changed_dates.Add(report_date.Date);

                            var exist = new DBContext.Table("jd_spread_report")
                                .Fields("id")
                                .Get<dynamic>("report_date=@report_date AND accountId=@accountId",
                                    new { report_date = report_date.Date, accountId = _account.id });

                            var update = new DBContext.Table("jd_spread_report")
                                .Add("accountId", _account.id)
                                .Add("accountName", _account.name)
                                .Add("clickNum", report.clickNum)
                                .Add("cosFee", report.cosFee)
                                .Add("cosPrice", report.cosPrice)
                                .Add("finishCosFee", report.finishCosFee)
                                .Add("finishCosPrice", report.finishCosPrice)
                                .Add("finishOrderNum", report.finishOrderNum)
                                .Add("orderNum", report.orderNum)
                                .Add("last_time", DateTime.Now);

                            if (exist == null)
                            {
                                update.Add("report_date", report_date.Date)
                                .Add("create_time", DateTime.Now)
                                .Create(DBContext.InsertType.REPLACE);
                            }
                            else
                            {
                                update.Where("id=@id", new { exist.id }).Update();
                            }
                        }
                    }
                }
                else
                {
                    throw new APIException(body);
                }
            }
            return changed_dates;
        }

    }
}
