using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Net.Http;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace bib_talk
{
    public partial class RegisterWindow : Window
    {
        public RegisterWindow()
        {
            InitializeComponent();
        }

		private void Hyperlink_RequestNavigate(object sender, RequestNavigateEventArgs e)
		{
			Process.Start(new ProcessStartInfo(e.Uri.AbsoluteUri) { UseShellExecute = true });
			e.Handled = true;
		}

		private void CloseButton_Click(object sender, RoutedEventArgs e)
        {
            this.Close();
        }

        private void DraggableArea_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            if (e.ButtonState == MouseButtonState.Pressed)
            {
                DragMove();
            }
        }

        private void Login_Click(object sender, RoutedEventArgs e)
        {
            Login login = new Login();
            login.Show();
            this.Close();
        }

        private void WeiterButton_Click(object sender, RoutedEventArgs e)
        {
            if (checkboxAGB.IsChecked == true)
            {
                if (ValidateRegistration())
                {
                    RegisterServer();
                    Login login = new Login();
                    login.Show();
                    this.Close();
                }
            }
            else
            {
                MessageBox.Show("Bitte akzeptieren Sie die AGB.");
            }
        }

        private void CheckBox_Checked(object sender, RoutedEventArgs e)
        {
            SolidColorBrush customBrush = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#FF6332A0"));
            weiterbutton.Foreground = Brushes.White;
            weiterbutton.Background = customBrush;
        }

        private void CheckBox_Unchecked(object sender, RoutedEventArgs e)
        {
            SolidColorBrush customBrush = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#FF323134"));
            weiterbutton.Foreground = Brushes.Gray;
            weiterbutton.Background = customBrush;
        }

        private bool ValidateRegistration()
        {
            string username = usernbox.Text;
            string password = passwordbox.Password;
            string email = emailbox.Text;
            string day = bday1.Text;
            string month = bday2.Text;
            string year = bday3.Text;

            // Benutzername validieren
            if (string.IsNullOrWhiteSpace(username) || username.Length < 3)
            {
                MessageBox.Show("Der Benutzername muss mindestens 3 Zeichen lang sein.");
                return false;
            }

            // Passwort validieren
            if (string.IsNullOrWhiteSpace(password) || password.Length < 6 || !Regex.IsMatch(password, @"^(?=.*[A-Za-z])(?=.*\d).{6,}$"))
            {
                MessageBox.Show("Das Passwort muss mindestens 6 Zeichen lang sein und sowohl Buchstaben als auch Zahlen enthalten.");
                return false;
            }

            // E-Mail validieren
            if (string.IsNullOrWhiteSpace(email) || !Regex.IsMatch(email, @"^[^@\s]+@[^@\s]+\.[^@\s]+$"))
            {
                MessageBox.Show("Bitte geben Sie eine gültige E-Mail-Adresse ein.");
                return false;
            }

            // Geburtsdatum validieren
            if (!int.TryParse(day, out int dayInt) || !int.TryParse(month, out int monthInt) || !int.TryParse(year, out int yearInt) ||
                !DateTime.TryParse($"{yearInt}-{monthInt}-{dayInt}", out DateTime birthDate) || birthDate > DateTime.Now.AddYears(-14))
            {
                MessageBox.Show("Bitte geben Sie ein gültiges Geburtsdatum ein. Sie müssen mindestens 18 Jahre alt sein.");
                return false;
            }

            return true;
        }

        public async Task RegisterServer()
        {
            string username = usernbox.Text;
            string password = passwordbox.Password;
            string email = emailbox.Text;
            string birthday = $"{bday1.Text}.{bday2.Text}.{bday3.Text}";
            var newUser = new { Username = username, Password = password, Email = email, Birthday = birthday, IsOnline = "" };
            string json = JsonConvert.SerializeObject(newUser);

            using (var client = new HttpClient())
            {
                var content = new StringContent(json, Encoding.UTF8, "application/json");
                var response = await client.PostAsync("http://daddypig.dns.navy:5114/api/users/register", content);

                if (response.IsSuccessStatusCode)
                {
                    MessageBox.Show("Registrierung erfolgreich.");
                }
                else
                {
                    MessageBox.Show("Registrierung fehlgeschlagen. " + response);
                }
            }
        }
	}
}