using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
using System.Web;
using System.Web.Script.Serialization;
using System.Windows;

namespace AnotherReplayReader
{
    /// <summary>
    /// Window1.xaml 的交互逻辑
    /// </summary>
    internal partial class Window1 : Window
    {
        private PlayerIdentity _identity;

        public Window1(PlayerIdentity identity)
        {
            InitializeComponent();
            _identity = identity;
            Refresh();
        }

        private async void Refresh()
        {
            Dispatcher.Invoke(() => _setIPButton.IsEnabled = false);
            try
            {
                Dispatcher.Invoke(() =>
                {
                    _dataGrid.Items.Clear();
                    _dataGrid.Items.Add(new IPAndPlayer { IP = 0, ID = "正在加载..." });
                });

                await _identity.Fetch();

                Display();
            }
            catch(Exception e)
            {
                Dispatcher.Invoke(() => MessageBox.Show(this, $"无法加载IP表:{e}"));
            }
            Dispatcher.Invoke(() => _setIPButton.IsEnabled = true);
        }

        private void Display(string filter = "", string nameFilter = "")
        {
            var newList = _identity
                .AsSortedList()
                .Where(x => x.IPString.StartsWith(filter) && x.ID.StartsWith(nameFilter, StringComparison.CurrentCultureIgnoreCase))
                .ToArray();
            Dispatcher.Invoke(() =>
            {
                _dataGrid.Items.Clear();
                foreach (var item in newList)
                {
                    _dataGrid.Items.Add(item);
                }
            });
        }

        private async void OnClick(object sender, RoutedEventArgs e)
        {
            Dispatcher.Invoke(() => _setIPButton.IsEnabled = false);

            await Task.Run(() =>
            {
                var ipText = Dispatcher.Invoke(() => _ipField.Text);

                if (!IPAddress.TryParse(ipText, out var ip))
                {
                    Dispatcher.Invoke(() => MessageBox.Show(this, "IP格式不正确")); 
                    return;
                }

                var idText = Dispatcher.Invoke(() => _idField.Text);

                if (string.IsNullOrWhiteSpace(idText))
                {
                    var result = Dispatcher.Invoke(() => MessageBox.Show(this, "你没填输入任何说明,是否确认继续?", "注意", MessageBoxButton.OKCancel));
                    if(result != MessageBoxResult.OK)
                    {
                        return;
                    }
                }

                try
                {
                    var bytes = ip.GetAddressBytes();
                    var ipNum = (uint)bytes[0] * 256 * 256 * 256 + bytes[1] * 256 * 256 + bytes[2] * 256 + bytes[3];
                    var text = HttpUtility.UrlEncode(idText);

                    var key = HttpUtility.UrlEncode(Auth.GetKey());
                    var request = WebRequest.Create($"https://lanyi.altervista.org/playertable/playertable.php?do=setIP&ip={ipNum}&id={text}&key={key}");

                    using (var stream = request.GetResponse().GetResponseStream())
                    using (var reader = new StreamReader(stream))
                    {
                        var response = reader.ReadToEnd();
                        var serializer = new JavaScriptSerializer();
                        var result = serializer.Deserialize<bool>(response);
                        if(!result)
                        {
                            Dispatcher.Invoke(() => MessageBox.Show(this, "设置IP表失败"));
                        }
                    }
                }
                catch (Exception exception)
                {
                    Dispatcher.Invoke(() => MessageBox.Show(this, $"设置IP表时发生错误。\r\n{exception}"));
                }

            });

            Refresh();
        }

        private async void OnIPFieldChanged(object sender, System.Windows.Controls.TextChangedEventArgs e)
        {
            var ipText = _ipField.Text;
            var idText = _idField.Text;
            await Task.Run(() => Display(ipText, idText));
        }

        private void DataGrid_MouseDoubleClick(object sender, System.Windows.Input.MouseButtonEventArgs e)
        {

        }
    }
}