using Newtonsoft.Json.Linq;
using System.Net;
using System.Net.Http;

namespace Zerolauncher.Manager
{
    internal class LoginManager
    {

        //private static readonly HttpClient client = new HttpClient();

        public static async Task SendPostRequest()
        {
            var client = new HttpClient();
            client.DefaultRequestVersion = HttpVersion.Version20;
            client.DefaultVersionPolicy = HttpVersionPolicy.RequestVersionOrLower;
            var values = new Dictionary<string, string>
            {
                { "thing1", "hello" },
                { "thing2", "world" }
            };
            var content = new FormUrlEncodedContent(values);
            var response = await client.PostAsync("http://www.example.com/recepticle.aspx", content);
            var responseString = await response.Content.ReadAsStringAsync();

            Console.WriteLine(responseString);
        }

        public static async Task LoginTest()
        {
            var client = new HttpClient();
            client.DefaultRequestVersion = HttpVersion.Version20;
            client.DefaultVersionPolicy = HttpVersionPolicy.RequestVersionOrLower;
            var values = new Dictionary<string, string>
            {
                { "thing1", "hello" },
                { "thing2", "world" }
            };
            var content = new FormUrlEncodedContent(values);
            var response = await client.PostAsync("http://www.example.com/recepticle.aspx", content);
            var responseString = await response.Content.ReadAsStringAsync();

            Console.WriteLine(responseString);
        }

        public static async Task<string?> AssetNet(HttpClient client, SingleGame game, string url, FormUrlEncodedContent? content =null)
        {
            try
            {
                var response = content != null? await client.PostAsync(url, content): await client.GetAsync(url);
				game.Send($"{StaticHandleS.HintText} response.StatusCode{response.StatusCode}");
                return await response.Content.ReadAsStringAsync();
            }
            catch (Exception ex)
            {
                game.Send($"{StaticHandleS.HintText} 网络发生错误，类型：{ex.GetType().Name}，消息：{ex.Message}");
                return null;
            }
            
        }

        public static async Task DoLogin(SingleGame game)
        {
            var client = new HttpClient();
			client.DefaultRequestVersion = HttpVersion.Version20;
			client.DefaultVersionPolicy = HttpVersionPolicy.RequestVersionOrLower;
			client.DefaultRequestHeaders.UserAgent.ParseAdd("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36 Edg/124.0.0.0");
			string? need_web = null;
            client.Timeout = TimeSpan.FromSeconds(3);
			game.Send($"{StaticHandleS.HintText} 尝试登玩家{game.account.nickName}到{ServicesStaticInfo.ServicesName[game.account.providerId]}的{game.account.serverId}服");
			switch (game.account.providerId)
            {
                case 0:
                    need_web = $"http://web.4399.com/stat/togame.php?target=ddt&server_id=S{game.account.serverId}";
                    {
                        var values = new Dictionary<string, string>
                        {
                            { "loginFrom", "uframe" },
                            { "postLoginHandler", "default" },
                            { "layoutSelfAdapting", "true" },
                            { "externalLogin", "qq" },
                            { "displayMode", "popup" },
                            { "layout", "vertical" },
                            { "appId", "www_home" },
                            { "mainDivId", "popup_login_div" },
                            { "includeFcmInfo", "false" },
                            { "userNameLabel", "4399用户名" },
                            { "userNameTip", "请输入4399用户名" },
                            { "welcomeTip", "欢迎回到4399" },
                            { "username", game.account.userName },
                            { "password", game.account.userPWD }
                        };
                        var responseString = await AssetNet(client, game, "http://ptlogin.4399.com/ptlogin/login.do?v=1", new FormUrlEncodedContent(values));
                        // eventHandles.__errorCallback('密码错误');
                        if (responseString == null) break;
                        if (responseString.Contains("eventHandles.__errorCallback"))
                        {
                            game.Send($"{StaticHandleS.HintText} 登录异常:{responseString.Split("eventHandles.__errorCallback('")[1].Split("'")[0]}");
                            break;
                        }
                        if (!game.Send($"{StaticHandleS.HintText} 登录成功,开始解析iframe")) return;
                    }
                    {
                        var responseString = await AssetNet(client, game, $"http://web.4399.com/stat/togame.php?target=ddt&server_id=S{game.account.serverId}");
                        if (responseString == null) break;
                        if (!responseString.Contains("name=\"game_box\""))
                        {
                            game.Send($"{StaticHandleS.HintText} 解析异常:服务器返回数据不正确");
                            if (responseString.Contains("维护")) game.Send($"{StaticHandleS.HintText} 检测到服务器在维护中，请耐心等候官方开服");
							break;
                        }
                        responseString = responseString.Split("name=\"game_box\"")[1].Split("src=\"")[1].Split("\"")[0];
                        HttpResponseMessage response;
                        try
                        {
                            response = await client.PostAsync(responseString, null);
                        }
                        catch (Exception ex)
                        {
                            game.Send($"{StaticHandleS.HintText} 网络发生错误，类型：{ex.GetType().Name.Replace(" ", "_")}，消息：{ex.Message.Replace(" ", "_")}");
                            break;
                        }
                        responseString = await response.Content.ReadAsStringAsync();
                        responseString = "http://" + response.RequestMessage.RequestUri.ToString().Split("/")[2] + "/" + responseString.Split("movie\" value='")[1].Split("'")[0];
                        //Trace.WriteLine(responseString);
                        game.Send($"{StaticHandleS.GameSa} {responseString}");
                    }
                    need_web = null ;
                    break;
                case 1:
					need_web = $"http://web.7k7k.com/games/togame.php?target=ddt_7&server_id={game.account.serverId}";
					{
                        var values = new Dictionary<string, string>
                        {
                            { "username", game.account.userName },
                            { "password", game.account.userPWD },
                            {"auto", "1" },
                            {"formtype", "index_log" }
						};
						var responseString = await AssetNet(client, game, "https://web.7k7k.com/source/Post.php", new FormUrlEncodedContent(values));
						if (responseString == null) break;
						//game.Send($"{StaticHandleS.HintText} {responseString}");
						JObject jsonObj = JObject.Parse(responseString);
						game.Send($"{StaticHandleS.HintText} {jsonObj["info"]}");
						if ((int)jsonObj["status"] != 1) break;
						if (!game.Send($"{StaticHandleS.HintText} 登录成功,开始解析iframe")) return;
					}
                    {
						HttpResponseMessage response;
						try
						{
							response = await client.GetAsync(need_web);
						}
						catch (Exception ex)
						{
							game.Send($"{StaticHandleS.HintText} 网络发生错误，类型：{ex.GetType().Name.Replace(" ", "_")}，消息：{ex.Message.Replace(" ", "_")}");
							break;
						}
						var responseString = await response.Content.ReadAsStringAsync();
						if (!responseString.Contains("movie\" value='"))
						{
							game.Send($"{StaticHandleS.HintText} 解析异常:服务器返回数据不正确");
							if (responseString.Contains("维护")) game.Send($"{StaticHandleS.HintText} 检测到服务器在维护中，请耐心等候官方开服");
							break;
						}
						responseString = "http://" + response.RequestMessage.RequestUri.ToString().Split("/")[2] + "/" + responseString.Split("movie\" value='")[1].Split("'")[0];
						//Trace.WriteLine(responseString);
						game.Send($"{StaticHandleS.GameSa} {responseString}");
					}
                    break;
                case 2:
                    need_web = $"http://www.wan.com/game/play/id/{game.account.serverId}";
                    break;
				default:
                    game.Send($"{StaticHandleS.HintText} 错误。未适配的运营商：{game.account.serverId}");
                    break;
            }
			client.Dispose();
            if (need_web == null) return;
            for (int i = 6; i > 0; i--)
            {
                await Task.Delay(1000);
                if (!game.Send($"{StaticHandleS.HintText} 自动登录失败，将在{i}后启用网页登录，关闭窗口取消")) { return; }
            }
            game.Send($"{StaticHandleS.UseBrowser} {need_web}");
        }
    }
}
