using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc.Controllers;
using Microsoft.AspNetCore.Mvc.Filters;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using dodohold.core;
using Dataoke;
using System.Text.RegularExpressions;
using Org.BouncyCastle.Ocsp;
using System.Diagnostics;
using TencentCloud.Fmu.V20191213.Models;
using Microsoft.VisualBasic;
using System.Text.Json;
using static System.Runtime.InteropServices.JavaScript.JSType;
using System.Security.Cryptography;
using Google.Protobuf.WellKnownTypes;
using System.Threading.Channels;
using TencentCloud.Tione.V20211111.Models;
using COSXML.Network;


namespace molilian.core
{
    public partial class UnionCpsCore
    {
        private static string _end_point;
        static UnionCpsCore()
        {
            _end_point = Environment.GetEnvironmentVariable("EndPoint");
        }

        public static UnionCpsDTO GetFormattedObject(string channel, string ip = "", string oaid = "")
        {
            return new()
            {
                channel = channel,
                end_point = _end_point,
                ip = ip,
                oaid = oaid
            };
        }

        #region CPS 相关 
        public static async Task<APIResult> UnionCpsAsync(string channelStr, string style, string ip, string oaid)
        {
            var channel_list = channelStr.Split(',');
            List<dynamic> list = new List<dynamic>();
            foreach (var channel in channel_list)
            {
                var result = await CpsCouponAsync(channel, style, ip, oaid);
                list.Add(new
                {
                    result.success,
                    result.message,
                    result.title,
                    result.sub_title,
                    result.deeplink_url,
                    result.token,
                    result.channel,
                });
            }

            return new APIResult(new
            {
                data = list,
            });
        }

        public static async Task<UnionCpsDTO> CpsCouponAsync(string channel, string style, string ip, string oaid)
        {
            UnionCpsDTO result = GetFormattedObject(channel, ip, oaid);
            if (string.IsNullOrEmpty(result.channel))
            {
                result.success = false;
                result.message = "放弃转链";
                result.reason = "无效渠道";
                _ = TkLogCore.CpsLogAsync(result);
                return result;
            }

            var config = TkConfigCore.Get();
            //============================== 放弃转链-地区过滤 ==============================
            if (CpsShouldIgnoreRequest(config, result.channel, ip, oaid, out string reason))
            {
                result.success = false;
                result.message = "流量控制";
                result.reason = reason;
                _ = TkLogCore.CpsLogAsync(result);
                return result;
            }

            var account = CpsPoolCore.GetOne(result.channel);
            if (account == null)
            {
                result.success = false;
                result.message = "放弃转链";
                result.reason = "没有匹配账号";
                _ = TkLogCore.CpsLogAsync(result);
                return result;
            }
            result.accountId = account.id;
            result.accountName = account.name;
            result.deeplink_url = account.deeplink;
            result.shortLinkurl = account.shortLinkurl;
            result.token = account.token;
            result.category = account.category;
            result.pid = account.pid;
            result.title = account.title;
            var style_record = CpsPoolCore.GetTitle(account, style);
            if (style_record != null)
            {
                result.title = style_record.title;
                result.sub_title = style_record.sub_title;
            }
            result.success = true;
            result.message = "OK";

            _ = TkLogCore.CpsLogAsync(result);
            return result;
            //return new APIResult(new
            //{
            //    result.success,
            //    result.message,
            //    result.reason,
            //    result.channel,
            //});
            //return new APIResult(new
            //{
            //    result.success,
            //    result.message,
            //    result.title,
            //    result.deeplink_url,
            //    result.token,
            //    result.channel,
            //});
        }



        public static async Task<APIResult> CpsCouponAsync22(string channel, string style, string ip, string oaid)
        {
            UnionCpsDTO result = GetFormattedObject(channel, ip, oaid);
            if (string.IsNullOrEmpty(result.channel))
            {
                result.success = false;
                result.message = "放弃转链";
                result.reason = "无效渠道";
                _ = TkLogCore.CpsLogAsync(result);
                return new APIResult(new
                {
                    result.success,
                    result.message,
                    result.reason,
                    channel,
                });
            }

            var config = TkConfigCore.Get();
            //============================== 放弃转链-地区过滤 ==============================
            if (CpsShouldIgnoreRequest(config, result.channel, ip, oaid, out string reason))
            {
                result.success = false;
                result.message = "流量控制";
                result.reason = reason;
                _ = TkLogCore.CpsLogAsync(result);
                return new APIResult(new
                {
                    result.success,
                    result.message,
                    result.reason,
                    result.channel,
                });
            }

            var account = CpsPoolCore.GetOne(result.channel);
            if (account == null)
            {
                result.success = false;
                result.message = "放弃转链";
                result.reason = "没有匹配账号";
                _ = TkLogCore.CpsLogAsync(result);
                return new APIResult(new
                {
                    result.success,
                    result.message,
                    result.reason,
                    result.channel,
                });
            }
            result.accountId = account.id;
            result.accountName = account.name;
            result.deeplink_url = account.deeplink;
            result.token = account.token;
            result.category = account.category;
            result.pid = account.pid;
            result.title = account.title;
            var style_record = CpsPoolCore.GetTitle(account, style);
            if (style_record != null)
            {
                result.title = style_record.title;
                result.sub_title = style_record.sub_title;
            }
            result.success = true;
            result.message = "OK";

            _ = TkLogCore.CpsLogAsync(result);
            return new APIResult(new
            {
                result.success,
                result.message,
                result.title,
                result.sub_title,
                result.deeplink_url,
                result.token,
                result.channel,
            });
        }


        public static async Task<APIResult> TbtCouponAsync(string content, string channel, string ip, string oaid)
        {
            UnionCpsDTO result = GetFormattedObject(channel, ip, oaid);
            if (string.IsNullOrEmpty(result.channel))
            {
                result.success = false;
                result.message = "放弃转链";
                result.reason = "无效渠道";
                _ = TkLogCore.CpsLogAsync(result);
                return new APIResult(new
                {
                    result.success,
                    result.message,
                    result.reason,
                    channel,
                });
            }

            AlimamaPlus alimama = null;
            content = content.UrlDecode();

            content = AlimamaPlus.FakeItemUrl(content, string.Empty);
            result.rawContent = content;

            if (string.IsNullOrEmpty(content))
            {
                result.success = false;
                result.message = "放弃转链";
                result.reason = "无效的参数";
                result.rawContent = content;
                _ = TkLogCore.CpsLogAsync(result);
                return new APIResult(new
                {
                    result.success,
                    result.reason,
                    result.message,
                    channel = result.channel.ToString(),
                });
            }

            try
            {
                string reason;
                UnionParseRequest request = new()
                {
                    Ip = ip,
                    Oaid = oaid,
                    RiskStrategy = string.Empty,
                    LaunchScene = 0,
                };

                if (AlimamaPlus.FilterRiskLink(ip, oaid, content, out reason) || AlimamaPlus.ShouldIgnoreRequest(request, out reason))
                {
                    result.success = false;
                    result.message = "放弃转链";
                    result.reason = reason;
                    _ = TkLogCore.CpsLogAsync(result);
                    return new APIResult(new
                    {
                        result.success,
                        result.message,
                        result.reason,
                        channel = result.channel.ToString(),
                    });
                }

                var account = await TkPoolCore.GetOneAsync(TkPoolCore.TkAction.parse, false, string.Empty, 0);
                if (account == null)
                {
                    result.success = false;
                    result.message = "放弃转链";
                    result.reason = "没有匹配账号";
                    _ = TkLogCore.CpsLogAsync(result);
                    return new APIResult(new
                    {
                        result.success,
                        result.message,
                        result.reason,
                        channel = result.channel.ToString(),
                    });
                }
                result.accountId = account.id;
                result.accountName = account.name;
                alimama = new AlimamaPlus(account);
                //result = await alimama.UnionCoupon2Async(content, result);


                TkDataDTO data = new();
                data = await alimama.alimamaParseAsync(content, data);

                result.success = data.success;
                result.reason = data.reason;
                result.message = data.success ? "OK" : data.message;

                if (result.success)
                {
                    result.token = data.taoToken;
                    //result.deeplink_url = data.deeplink_url;
                    result.couponAmount = data.couponAmount;
                    result.shortLinkurl = data.shortLinkurl;
                    result.itemId = data.itemId;
                }
            }
            catch (Exception ex)
            {
                if (ex.Message.Contains("was canceled"))
                {
                    result.success = false;
                    result.message = "放弃转链";
                    result.reason = "请求超时";
                }
                else
                {
                    _ = new LoggerLibrary("unionCoupon", "tb_error")
                        .Info(ip, oaid)
                        .Info(content)
                        .Info(ex.Message, ex.StackTrace)
                        .SaveAsync();

                    NotifyCore.Notify(new NifyMessage
                    {
                        message = $"【转链异常TB】\n{content}\n\n{ex.Message}\n{ex.StackTrace}",
                        priority = NifyMessagePriority.high,
                        tags = ["red_circle"]
                    });
                    result.success = false;
                    result.message = "放弃转链";
                    result.reason = "转链接口异常";
                }
            }
            _ = TkLogCore.CpsLogAsync(result);
            return new APIResult(new
            {
                result.success,
                result.message,
                result.title,
                result.sub_title,
                result.deeplink_url,
                result.token,
                result.channel,
            });
        }

        //public static async Task<APIResult> EleAsync(string ip, string oaid)
        //{
        //    UnionCpsDTO result = GetFormattedObject(CpsChannelEnum.eleme, ip, oaid);
        //    var config = TkConfigCore.Get();

        //    //============================== 放弃转链-地区过滤 ==============================
        //    if (CpsShouldIgnoreRequest(config, result.channel, ip, oaid, out string reason))
        //    {
        //        result.success = false;
        //        result.message = "流量控制";
        //        result.reason = reason;
        //        _ = TkLogCore.CpsLogAsync(result);
        //        return new APIResult(new
        //        {
        //            result.success,
        //            result.message,
        //            result.reason,
        //            channel = result.channel.ToString(),
        //        });
        //    }

        //    var account = ElePoolCore.GetOne();
        //    if (account == null)
        //    {
        //        result.success = false;
        //        result.message = "放弃转链";
        //        result.reason = "没有匹配账号";
        //        _ = TkLogCore.CpsLogAsync(result);
        //        return new APIResult(new
        //        {
        //            result.success,
        //            result.message,
        //            result.reason,
        //            channel = result.channel.ToString(),
        //        });
        //    }
        //    result.accountId = account.id;
        //    result.accountName = account.name;
        //    result.deeplink_url = account.deeplink;
        //    result.success = true;
        //    result.message = "OK";

        //    _ = TkLogCore.CpsLogAsync(result);
        //    return new APIResult(new
        //    {
        //        result.success,
        //        result.message,
        //        result.deeplink_url,
        //        channel = result.channel.ToString(),
        //    });
        //}

        //public static async Task<APIResult> MeituanAsync(string ip, string oaid)
        //{
        //    UnionCpsDTO result = GetFormattedObject(CpsChannelEnum.meituan, ip, oaid);
        //    var config = TkConfigCore.Get();

        //    //============================== 放弃转链-地区过滤 ==============================
        //    if (CpsShouldIgnoreRequest(config, result.channel, ip, oaid, out string reason))
        //    {
        //        result.success = false;
        //        result.message = "流量控制";
        //        result.reason = reason;
        //        _ = TkLogCore.CpsLogAsync(result);
        //        return new APIResult(new
        //        {
        //            result.success,
        //            result.message,
        //            result.reason,
        //            channel = result.channel.ToString(),
        //        });
        //    }

        //    var account = MeituanPoolCore.GetOne();
        //    if (account == null)
        //    {
        //        result.success = false;
        //        result.message = "放弃转链";
        //        result.reason = "没有匹配账号";
        //        _ = TkLogCore.CpsLogAsync(result);
        //        return new APIResult(new
        //        {
        //            result.success,
        //            result.message,
        //            result.reason,
        //            channel = result.channel.ToString(),
        //        });
        //    }
        //    result.accountId = account.id;
        //    result.accountName = account.name;
        //    result.deeplink_url = account.deeplink;
        //    result.success = true;
        //    result.message = "OK";

        //    _ = TkLogCore.CpsLogAsync(result);
        //    return new APIResult(new
        //    {
        //        result.success,
        //        result.message,
        //        result.deeplink_url,
        //        channel = result.channel.ToString(),
        //    });
        //}

        public static bool CpsShouldIgnoreRequest(TkConfigDTO config, string channel, string ip, string oaid, out string reason)
        {
            reason = string.Empty;
            try
            {
                // IP和流量控制
                string ignorePercentageCity = config.cpsIgnorePercentageCity;
                string? ipInfo = IP2RegionPlus.Search(ip);
                if (!TestParseCore.InWhitelist(ip, oaid) && AlimamaPlus.IgnoreRegionIncluded(ignorePercentageCity, ipInfo, out string regionInfo))
                {
                    reason = $"地区控制：{regionInfo}";
                    return true;
                }

                int limit_num = config.cps_limit_per_ip_24h;
                if (limit_num > 0)
                {
                    int num = TkLogCore.getClientRequestTotalByIp(channel, ip);
                    if (num > limit_num)
                    {
                        reason = "IP控制";
                        return true;
                    }
                }

                limit_num = config.cps_limit_per_oaid_24h;
                if (limit_num > 0)
                {
                    int num = TkLogCore.getClientRequestTotalByOAID(channel, oaid);
                    if (num > limit_num)
                    {
                        reason = "OAID控制";
                        return true;
                    }
                }
            }
            catch (Exception ex)
            {
                reason = "配置异常";
            }
            return false;
        }
        #endregion



    }
}
