using molilian.core;
using dodohold.core;
using Microsoft.AspNetCore.Mvc;
using Org.BouncyCastle.Ocsp;
using System.Text.Json;
using System.Runtime.InteropServices;
using System.Net;
using System.Threading.Channels;
using TencentCloud.Cdwch.V20200915.Models;
using COSXML.Network;
using System.Security.Cryptography;
using System.Threading;
using TencentCloud.Batch.V20170312.Models;

namespace molilian.api.Controllers
{
    [ApiController]
    [Route("[controller]_70160bd632/[action]")]
    public class TaskController : ControllerBase
    {

        protected IHttpContextAccessor _accessor;
        public TaskController(IHttpContextAccessor accessor)
        {
            _accessor = accessor;
        }



        [HttpGet]
        public ActionResult BatchInsertLogDB(int limit = 100)
        {
            int total = TkLogCore.BatchInsertLogDB(limit);
            return new APIResult(new { success = true, message = "ok", limit, total });
        }


        [HttpGet]
        public async Task<ActionResult> GetSettleBills(int sleep = 2000)
        {
            var list = TkPoolCore.List();
            if (list == null) return new APIResult(new { success = false, message = "没有有效账号", });

            string message = string.Empty;
            int total = 0;
            foreach (var account in list)
            {
                if (!account.enable_sync_order) continue;
#if DEBUG
                if (13 != account.id) continue;
#endif
                try
                {
                    var alimama = new AlimamaPlus(account);
                    total += alimama.GetSettleBills(sleep);
                }
                catch (Exception ex)
                {
                    message = $"【收益接口异常】\t{account.name}\n{ex.Message}\n{ex.StackTrace}";
                    NotifyCore.Notify(new NifyMessage
                    {
                        message = message,
                        priority = NifyMessagePriority.high,
                        tags = ["red_circle"]
                    });
                    continue;
                }
            }
            return new APIResult(new { success = true, message = "ok", total });
        }


        [HttpGet]
        public async Task<ActionResult> GetHistoryOrders(int id, int sleep, DateTime startTime, DateTime endTime)
        {
            var list = TkPoolCore.List();
            if (list == null) return new APIResult(new { success = false, message = "没有有效账号", });
            if (id == 0) return new APIResult(new { success = false, message = "没有有效账号", });

            string message = string.Empty;
            int total = 0;
            foreach (var account in list)
            {

                if (id != account.id) continue;

                try
                {
                    //DateTime endTime = DateTime.Now;
                    //DateTime startTime = endTime.AddDays(-90);
                    if (account.id == 3) endTime = DateTime.Parse("2024-04-07");


                    var alimama = new AlimamaPlus(account);
                    total += alimama.GetHistoryOrders(sleep, startTime, endTime);
                }
                catch (Exception ex)
                {
                    message = $"【历史订单接口异常】[{account.id}]{account.company}\n{ex.Message}\n{ex.StackTrace}";
                    NotifyCore.Notify(new NifyMessage
                    {
                        message = message,
                        priority = NifyMessagePriority.high,
                        tags = ["red_circle"]
                    });
                    continue;
                }
            }
            return new APIResult(new { success = true, message = "ok", total });
        }

        [HttpGet]
        public async Task<ActionResult> GetIncyOrders(int sleep = 2000)
        {
            var list = TkPoolCore.List();
            if (list == null) return new APIResult(new { success = false, message = "没有有效账号", });
            string message = string.Empty;
            int total = 0;
            foreach (var account in list)
            {
#if DEBUG
                if (account.id != 17) continue;
#endif
                if (!account.enable_sync_order) continue;

                try
                {
                    var alimama = new AlimamaPlus(account);
                    total += alimama.GetIncyOrders(sleep);
                }
                catch (Exception ex)
                {
                    message = $"【新增订单接口异常】[{account.id}]{account.company}\n{ex.Message}\n{ex.StackTrace}";
                    NotifyCore.Notify(new NifyMessage
                    {
                        message = message,
                        priority = NifyMessagePriority.high,
                        tags = ["red_circle"]
                    });
                    continue;
                }
            }
            return new APIResult(new { success = true, message = "ok", total });
        }



        [HttpGet]
        public async Task<ActionResult> GetOrdersByAdZone(int id, long adzoneId, int sleep, DateTime startTime, DateTime endTime)
        {
            var list = TkPoolCore.List();
            if (list == null) return new APIResult(new { success = false, message = "没有有效账号", });
            string message = string.Empty;
            int total = 0;
            foreach (var account in list)
            {
#if DEBUG
                if (account.id != id) continue;
#endif
                try
                {
                    var alimama = new AlimamaPlus(account);
                    total += alimama.GetOrdersByAdZone(adzoneId, startTime, endTime, sleep);
                }
                catch (Exception ex)
                {
                    message = $"【新增订单接口异常adzone】[{account.id}]{account.company}\n{ex.Message}\n{ex.StackTrace}";
                    NotifyCore.Notify(new NifyMessage
                    {
                        message = message,
                        priority = NifyMessagePriority.high,
                        tags = ["red_circle"]
                    });
                    continue;
                }
            }
            return new APIResult(new { success = true, message = "ok", total });
        }


        [HttpGet]
        public async Task<ActionResult> GetHistoryRefundOrders(int id, int sleep, DateTime startTime, DateTime endTime)
        {
            var list = TkPoolCore.List();
            if (list == null) return new APIResult(new { success = false, message = "没有有效账号", });
            if (id == 0) return new APIResult(new { success = false, message = "没有有效账号", });

            string message = string.Empty;
            int total = 0;
            foreach (var account in list)
            {

                if (id != account.id) continue;

                try
                {
                    //DateTime endTime = DateTime.Now;
                    //DateTime startTime = endTime.AddDays(-90);
                    if (account.id == 3) endTime = DateTime.Parse("2024-04-07");


                    var alimama = new AlimamaPlus(account);
                    total += alimama.GetHistoryRefundOrders(sleep, startTime, endTime);
                }
                catch (Exception ex)
                {
                    message = $"【维权订单接口异常】[{account.id}]{account.company}\n{ex.Message}\n{ex.StackTrace}";
                    NotifyCore.Notify(new NifyMessage
                    {
                        message = message,
                        priority = NifyMessagePriority.high,
                        tags = ["red_circle"]
                    });
                    continue;
                }
            }
            return new APIResult(new { success = true, message = "ok", total });
        }

        [HttpGet]
        public async Task<ActionResult> GetIncyRefundOrders(int sleep = 2000)
        {
            var list = TkPoolCore.List();
            if (list == null) return new APIResult(new { success = false, message = "没有有效账号", });
            string message = string.Empty;
            int total = 0;
            foreach (var account in list)
            {
#if DEBUG
                if (account.id != 17) continue;
#endif
                if (!account.enable_sync_order) continue;

                try
                {
                    var alimama = new AlimamaPlus(account);
                    total += alimama.GetIncyRefundOrders(sleep);
                }
                catch (Exception ex)
                {
                    message = $"【维权订单接口异常】[{account.id}]{account.company}\n{ex.Message}\n{ex.StackTrace}";
                    NotifyCore.Notify(new NifyMessage
                    {
                        message = message,
                        priority = NifyMessagePriority.high,
                        tags = ["red_circle"]
                    });
                    continue;
                }
            }
            return new APIResult(new { success = true, message = "ok", total });
        }




        [HttpGet]
        public async Task<ActionResult> GetViolationuWarning()
        {
            var list = TkPoolCore.List();
            if (list == null) return new APIResult(new { success = false, message = "没有有效账号", });
            string message = string.Empty;
            foreach (var account in list)
            {
                try
                {
                    var alimama = new AlimamaPlus(account);
                    alimama.GetViolationuWarning();
                }
                catch (Exception ex)
                {
                    message = $"【报表接口异常】GetViolationuWarning\n{ex.Message}\n{ex.StackTrace}";
                    NotifyCore.Notify(new NifyMessage
                    {
                        message = message,
                        priority = NifyMessagePriority.high,
                        tags = ["red_circle"]
                    });
                    continue;
                }
            }
            return new APIResult(new { success = true, message = "ok" });
        }

        [HttpGet]

        public async Task<ActionResult> DailyLogs(int intervalDay = 1)
        {
            try
            {
                //本节点统计
                AlimamaPlus.NodeDailyLogs(intervalDay, "parse_", "tb");
                AlimamaPlus.NodeDailyLogs(intervalDay, "coupon_", "tb");
                AlimamaPlus.NodeDailyLogs(intervalDay); //第三方老的统计

                if (CenterHub.IsCenter)
                {
                    JdUnionPlus.DailyLogs(intervalDay);
                    ToolParsePlus.DailyLogs(intervalDay);

                    //中心服务器统计
                    AlimamaPlus.AllDailyLogs(intervalDay, "parse_", "tb");
                    AlimamaPlus.AllDailyLogs(intervalDay, "coupon_", "tb");
                    AlimamaPlus.AllDailyLogs(intervalDay);
                }
            }
            catch (Exception ex)
            {
                string message = $"【报表接口异常】DailyLogs\n{ex.Message}\n{ex.StackTrace}";
                NotifyCore.Notify(new NifyMessage
                {
                    message = message,
                    priority = NifyMessagePriority.high,
                    tags = ["red_circle"]
                });
            }
            return new APIResult(new { success = true, message = "ok" });
        }


        [HttpGet]

        public async Task<ActionResult> ApiCallStatistics(int intervalDay = 1)
        {
            try
            {
                AlimamaPlus.ApiCallStatistics(1, intervalDay, TkChannelEnum.tb);
                AlimamaPlus.ApiCallStatistics(2, intervalDay, TkChannelEnum.tb);
            }
            catch (Exception ex)
            {
                string message = $"【API报表更新异常】ApiCallStatistics\n{ex.Message}\n{ex.StackTrace}";
                NotifyCore.Notify(new NifyMessage
                {
                    message = message,
                    priority = NifyMessagePriority.high,
                    tags = ["red_circle"]
                });
            }
            return new APIResult(new { success = true, message = "ok" });
        }


        [HttpGet]
        public async Task<ActionResult> DailyTable(int days = 7)
        {
            try
            {
                for (int i = 0; i < days; i++)
                {
                    if (CenterHub.IsCenter)
                    {

                    }
                    else
                    {

                    }

                    string table_suffix = DateTime.Now.AddDays(i).ToString("yyyyMMdd");
                    string sql = $"CREATE TABLE IF NOT EXISTS tk_parse_logs_{table_suffix} LIKE tk_parse_logs;";
                    DBContext.Execute(sql, null);
                    sql = $"CREATE TABLE IF NOT EXISTS jd_parse_logs_{table_suffix} LIKE jd_parse_logs;";
                    DBContext.Execute(sql, null);
                    sql = $"CREATE TABLE IF NOT EXISTS ks_parse_logs_{table_suffix} LIKE ks_parse_logs;";
                    DBContext.Execute(sql, null);
                    sql = $"CREATE TABLE IF NOT EXISTS tk_promotion_logs_{table_suffix} LIKE tk_promotion_logs;";
                    DBContext.Execute(sql, null);
                }
                TkLogCore.save_dailys_log = true;
                RedisHelper.Set("turn:save_dailys_log", 1, 86400);
            }
            catch (Exception ex)
            {
                string message = $"【创建数据标错误】\n{ex.Message}\n{ex.StackTrace}";
                NotifyCore.Notify(new NifyMessage
                {
                    message = message,
                    priority = NifyMessagePriority.high,
                    tags = ["red_circle"]
                });
            }
            return new APIResult(new { success = true, message = "ok" });
        }

        //[HttpGet]

        //public async Task<ActionResult> ApiCallStatistics(int intervalDay = 1)
        //{
        //    try
        //    {
        //        AlimamaPlus.ApiCallStatistics(intervalDay, TkChannelEnum.tb);
        //        AlimamaPlus.ApiCallStatistics(intervalDay, TkChannelEnum.tb, "parse_");
        //        AlimamaPlus.ApiCallStatistics(intervalDay, TkChannelEnum.tb, "coupon_");

        //        AlimamaPlus.ApiCallStatistics(intervalDay, TkChannelEnum.wemeet, "parse_");
        //        AlimamaPlus.ApiCallStatistics(intervalDay, TkChannelEnum.bdpan, "parse_");

        //        AlimamaPlus.ApiCallStatistics(intervalDay, TkChannelEnum.dy, "parse_");
        //        AlimamaPlus.ApiCallStatistics(intervalDay, TkChannelEnum.jd, "parse_");

        //    }
        //    catch (Exception ex)
        //    {
        //        string message = $"【报表接口异常】ApiCallStatistics\n{ex.Message}\n{ex.StackTrace}";
        //        NotifyCore.Notify(new NifyMessage
        //        {
        //            message = message,
        //            priority = NifyMessagePriority.high,
        //            tags = ["red_circle"]
        //        });
        //    }
        //    return new APIResult(new { success = true, message = "ok" });
        //}


        [HttpGet]
        public async Task<ActionResult> GetDrawBalance()
        {
            var list = TkPoolCore.List();
            if (list == null) return new APIResult(new { success = false, message = "没有有效账号", });
            string message = string.Empty;
            foreach (var account in list)
            {
                if (!account.enable_sync_order) continue;
                try
                {
                    var alimama = new AlimamaPlus(account);
                    alimama.GetDrawBalance();
                }
                catch (Exception ex)
                {
                    message = $"【报表接口异常】GetDrawBalance\n{ex.Message}\n{ex.StackTrace}";
                    NotifyCore.Notify(new NifyMessage
                    {
                        message = message,
                        priority = NifyMessagePriority.high,
                        tags = ["red_circle"]
                    });
                    continue;
                }
            }
            return new APIResult(new { success = true, message = "ok" });
        }

        [HttpGet]
        public async Task<ActionResult> FastReport()
        {
            string message = string.Empty;
            var list = TkPoolCore.List();
            if (list != null)
            {
                foreach (var account in list)
                {
                    if (!account.enable_sync_order) continue;
                    try
                    {
                        var alimama = new AlimamaPlus(account);
                        alimama.SaveReportOverview();
                    }
                    catch (Exception ex)
                    {
                        message = $"【报表接口异常】FastReport\n{ex.Message}\n{ex.StackTrace}";
                        NotifyCore.Notify(new NifyMessage
                        {
                            message = message,
                            priority = NifyMessagePriority.high,
                            tags = ["red_circle"]
                        });
                        continue;
                    }
                }
            }
            string filter = "";
            var jd_list = new DBContext.Table("jd_pool").Where(filter, null).Select<JdPoolDTO>();
            if (jd_list != null)
            {
                bool any_jd_changed = false;
                foreach (var account in jd_list)
                {
                    bool changed = false;
                    try
                    {
                        account.current_daily_calls = JdPoolCore.SaveCalls(account.id, DateTime.Now.ToString("yyyyMMdd"));
                        account.current_hourly_calls = JdPoolCore.SaveCalls(account.id, DateTime.Now.ToString("yyyyMMddHH"));
                        changed = true;
                        any_jd_changed = true;
                    }
                    catch (Exception ex)
                    {
                        message = $"【JD计数异常】SaveCalls\n{ex.Message}\n{ex.StackTrace}";
                        NotifyCore.Notify(new NifyMessage
                        {
                            message = message,
                            priority = NifyMessagePriority.high,
                            tags = ["red_circle"]
                        });
                        continue;
                    }
                    if (!account.status) continue;
                    if (!string.IsNullOrEmpty(account.cookies))
                    {
                        try
                        {
                            var plus = new JdUnionPlus(account);
                            var data = await plus.queryTodaySpreadEffectData();
                            account.today_clickNum = data.clickNum;
                            account.today_cosFee = data.cosFee;
                            account.today_cosPrice = data.cosPrice;
                            account.today_finishCosFee = data.finishCosFee;
                            account.today_finishCosPrice = data.finishCosPrice;
                            account.today_finishOrderNum = data.finishOrderNum;
                            account.today_orderNum = data.orderNum;

                            changed = true;
                            any_jd_changed = true;
                        }
                        catch (Exception ex)
                        {
                            if (ex.Message.Contains("no login"))
                            {
                                account.status = false;
                                JdPoolCore.Disabled(account.id, account.name, ex.Message);
                            }
                            message = $"【JD报表接口异常】{account.id}:{account.name}\tqueryTodaySpreadEffectData\n{account.Convert2Json()}\n{ex.Message}\n{ex.StackTrace}";
                            NotifyCore.Notify(new NifyMessage
                            {
                                message = message,
                                priority = NifyMessagePriority.high,
                                tags = ["red_circle"]
                            });
                            continue;
                        }
                    }
                    if (changed) JdPoolCore.Update(account);
                }
                if (any_jd_changed) JdPoolCore.Refresh();
            }


            var pdd_list = new DBContext.Table("pdd_pool").Where(filter, null).Select<PddPoolDTO>();
            if (pdd_list != null)
            {
                bool any_pdd_changed = false;
                foreach (var account in pdd_list)
                {
                    bool changed = false;
                    try
                    {
                        account.current_daily_calls = PddPoolCore.SaveCalls(account.id, DateTime.Now.ToString("yyyyMMdd"));
                        account.current_hourly_calls = PddPoolCore.SaveCalls(account.id, DateTime.Now.ToString("yyyyMMddHH"));
                        changed = true;
                        any_pdd_changed = true;
                    }
                    catch (Exception ex)
                    {
                        message = $"【Pdd计数异常】SaveCalls\n{ex.Message}\n{ex.StackTrace}";
                        NotifyCore.Notify(new NifyMessage
                        {
                            message = message,
                            priority = NifyMessagePriority.high,
                            tags = ["red_circle"]
                        });
                        continue;
                    }
                    if (changed) PddPoolCore.Update(account);
                }
                if (any_pdd_changed) PddPoolCore.Refresh();
            }

            await EndPointCore.NotifyReload(true);
            return new APIResult(new { success = true, message = "ok" });
        }

        [HttpGet]
        public async Task<ActionResult> SaveReport()
        {
            string message = string.Empty;

            var list = TkPoolCore.List();
            if (list != null)
            {
                foreach (var account in list)
                {
                    if (!account.enable_sync_order) continue;
#if DEBUG
                    if (account.id != 5) continue;
#endif
                    try
                    {
                        var alimama = new AlimamaPlus(account);
                        alimama.SaveReportHourtrend(DateTime.Now.AddDays(-1));
                        alimama.SaveReportHourtrend(DateTime.Now);

                        if (DateTime.Now.Hour >= 12 && DateTime.Now.Hour < 16)
                        {
                            DateTime date = DateTime.Now.AddDays(-1);
                            alimama.FixReport(date);
                        }
                    }
                    catch (Exception ex)
                    {
                        message = $"【报表接口异常】SaveReport\n{ex.Message}\n{ex.StackTrace}";
                        NotifyCore.Notify(new NifyMessage
                        {
                            message = message,
                            priority = NifyMessagePriority.high,
                            tags = ["red_circle"]
                        });
                        continue;
                    }
                }
            }
            return new APIResult(new { success = true, message = "ok" });
        }

        [HttpGet]
        public async Task<ActionResult> JdSaveReport()
        {
            string message = string.Empty;

            var jd_list = new DBContext.Table("jd_pool").Where("", null).Select<JdPoolDTO>();
            if (jd_list != null)
            {
                DateTime startDate = DateTime.Now.AddDays(-1);
                DateTime endDate = DateTime.Now.AddDays(-1);
                foreach (var account in jd_list)
                {
                    if (!account.status) continue;
#if DEBUG
                    if (account.id != 10) continue;
#endif


                    if (!string.IsNullOrEmpty(account.cookies))
                    {
                        try
                        {
                            var plus = new JdUnionPlus(account);
                            _ = await plus.querySpreadEffectData(startDate, endDate);
                            _ = await plus.queryEstimateCommList();
                        }
                        catch (Exception ex)
                        {
                            if (ex.Message.Contains("no login"))
                            {
                                JdPoolCore.Disabled(account.id, account.name, ex.Message);
                            }
                            message = $"【JD报表接口异常】{account.id}:{account.name}\tquerySpreadEffectData\n{ex.Message}\n{ex.StackTrace}";
                            NotifyCore.Notify(new NifyMessage
                            {
                                message = message,
                                priority = NifyMessagePriority.high,
                                tags = ["red_circle"]
                            });
                            continue;
                        }
                    }
                }
            }
            return new APIResult(new { success = true, message = "ok" });
        }

        [HttpGet]
        public async Task<ActionResult> FixReport(int id, string dt)
        {
            if (!DateTime.TryParse(dt, out DateTime date))
            {
                return new APIResult(new { success = false, message = "日期错误", });
            }

            var list = TkPoolCore.List();
            if (list == null) return new APIResult(new { success = false, message = "没有有效账号", });
            string message = string.Empty;
            foreach (var account in list)
            {
                if (id != account.id) continue;
                try
                {
                    var alimama = new AlimamaPlus(account);

                    while (date.Date < DateTime.Now.Date)
                    {
                        alimama.FixReport(date);
                        date = date.AddDays(1);
                    }
                }
                catch (Exception ex)
                {
                    message = $"【报表接口异常】SaveReport\n{ex.Message}\n{ex.StackTrace}";
                    NotifyCore.Notify(new NifyMessage
                    {
                        message = message,
                        priority = NifyMessagePriority.high,
                        tags = ["red_circle"]
                    });
                    continue;
                }
            }
            return new APIResult(new { success = true, message = "ok" });
        }

        [HttpGet]
        public ActionResult RenewCookie(string name)
        {
            var account = new DBContext.Table("tk_pool").Get<TkPoolDTO>("name=@name", new { name });

            if (account == null) return new APIResult(new { success = false, message = "没有有效账号", });
            var alimama = new AlimamaPlus(account);

            (bool success, string message) = alimama.RenewCookie();
            return new APIResult(new { success, message });
        }


        [HttpGet]
        public ActionResult Reload()
        {
            TkConfigCore.Refresh();
            EndPointCore.Refresh();
            ProxyNodesCore.Refresh();
            TkPoolCore.Refresh();
            VeapiPoolCore.Refresh();

            ApiAccountCore.Refresh();
            DataokeCore.Refresh();
            JdPoolCore.Refresh();
            PddPoolCore.Refresh();
            PangolinPoolCore.Refresh();

            //ElePoolCore.Refresh();
            //MeituanPoolCore.Refresh();
            CpsPoolCore.Refresh();
            DeeplinkParseRuleCore.Refresh();

            return new APIResult(new
            {
                success = true,
                message = "ok",
            });
        }

        [HttpGet]
        public ActionResult ReloadAccount()
        {
            EndPointCore.Refresh();
            ProxyNodesCore.Refresh();
            TkPoolCore.Refresh();
            VeapiPoolCore.Refresh();
            JdPoolCore.Refresh();
            PddPoolCore.Refresh();

            //ElePoolCore.Refresh();
            //MeituanPoolCore.Refresh();
            CpsPoolCore.Refresh();

            return new APIResult(new
            {
                success = true,
                message = "ok",
            });
        }



        [HttpGet]
        public async Task<ActionResult> CheckDeepUrl(int accountid)
        {
            var postContent = "88✔7Fi43dJwWpV£ https://m.tb.cn/h.g92hfR4JLgn7yvG  MF7997 我分享给你了一个超赞的内容，快来看看吧";
            var channel = "tb";
            var ip = "127.0.0.1";
            var oaid = "test-oaid";

            bool success = false;
            string message;

            //============================== 放弃转链-没有匹配账号 ==============================
            TkPoolDTO? account = TkPoolCore.GetOne(accountid);
            if (account == null)
            {
                return new APIResult(new
                {
                    success = false,
                    message = "没有匹配账号",
                });
            }
            var alimama = new AlimamaPlus(account);

            TkDataDTO result = new TkDataDTO();
            string url = AlimamaPlus.GetLink(postContent);
            if (string.IsNullOrEmpty(url))
            {
                return new APIResult(new
                {
                    success = false,
                    message = "无效URL",
                });
            }

            (success, string content) = await alimama.GetDesiredUrlAsync(url);
            if (content.Contains("霸下通用 web 页面-验证码"))
            {
                message = "霸下验证码";
            }
            else
            {
                message = content;
            }
            return new APIResult(new
            {
                success = true,
                message,
            });
        }

    }
}