using System;
using System.Linq;
using System.Windows;
using System.Windows.Input;
using System.Windows.Media;

using BeWo.ServiceProxy;
using BeWo.ViewModel;

using BS.Shared.Extensions;

namespace BeWo.View
{
	public partial class PasswortAenderungsView
	{
		public UserVM ViewModel { get; set; }
        public int abr = 0;

		public PasswortAenderungsView()
		{
			InitializeComponent();
			CommandBindings.Add(new CommandBinding(ApplicationCommands.Close, (s, e) =>
			{
                abr = 1;

			    Close();
			}));
			VMFactory.CreateUserVMAsync(BeWoApp.LoggedOnUser.UserOid.Value, vm => ViewModel = vm);
		}

		private void RootGroupBox_OnMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
		{
			try
			{
				DragMove();
			}
			catch (Exception) { }
		}

		private void AendernClick(object sender, RoutedEventArgs e)
		{
			textblock_editFailures.Foreground = new SolidColorBrush(Colors.Red);
			//if (ViewModel.CheckOldPassword(AltesPwBox.Password))
			//{
			//	textblock_editFailures.Text = "Das alte Passwort ist nicht korrekt!";
			//	MessageBox.Show("Das alte Passwort ist nicht korrekt!", "Ändern des Passworts fehlgeschlagen", MessageBoxButton.OK, MessageBoxImage.Information);
			//	return;
			//}
			if (string.IsNullOrEmpty(NeuesPwBox.Password))
			{
				textblock_editFailures.Text = "Bitte geben Sie ein neues Passwort ein!";
				MessageBox.Show("Bitte geben Sie ein neues Passwort ein!", "Ändern des Passworts fehlgeschlagen", MessageBoxButton.OK, MessageBoxImage.Information);
				return;
			}

			if (NeuesPwBox.Password != NeuesPwBox2.Password)
			{
				textblock_editFailures.Text = "Die Passwörter stimmen nicht überein!";
				MessageBox.Show("Die Passwörter stimmen nicht überein!", "Ändern des Passworts fehlgeschlagen", MessageBoxButton.OK, MessageBoxImage.Information);
				return;
			}

			var lOld = AltesPwBox.Password;
			var lNew = NeuesPwBox.Password;

            ServiceFacade.DoUserServiceAsync(s => s.CheckPassword(BeWoApp.LoggedOnUser.UserOid.Value, lOld, lNew),
                result => CheckPasswordResult(result, lOld, lNew), true);

		}

        private void CheckPasswordResult(String result, String oldPassword, String newPassword)
        {
            if (String.IsNullOrEmpty(result))
            {
                ServiceFacade.DoUserServiceAsync(
                s1 =>
                {
                    var erg = s1.ChangePassword(ViewModel.DataContract.LoginName, ViewModel.DataContract.UserVersion.Value, oldPassword, newPassword);
                    return erg;
                },
                obj =>
                {
                    if (ViewModel.DataContract.UserOid == BeWoApp.LoggedOnUser.UserOid)
                    {
                        BeWoApp.UserPassword = newPassword;
                        ServiceFacade.DoUserServiceAsync(s => s.LoadUser(BeWoApp.LoggedOnUser.UserOid.Value), obj2 =>
                        {
                            BeWoApp.LoggedOnUser = obj2;
                            BeWoApp.LoggedOnUser.ResetPasswordInfos.ForEach(f => f.HasToChangePW = false);
                            ServiceFacade.DoUserServiceAsync(s3 => s3.UpdateUser(BeWoApp.LoggedOnUser), true);
                        }, true);
                    }

                    this.Dispatch(Close);
                },
                true);
            }
            else
            {     
                this.Dispatch(delegate { 
                    textblock_editFailures.Text = result;
					MessageBox.Show(result, "Ändern des Passworts fehlgeschlagen", MessageBoxButton.OK, MessageBoxImage.Information);
                });
            }
        }

		private void AltesPWgeaendert(object sender, RoutedEventArgs e)
		{
			textblock_editFailures.Text = string.Empty;
		}

		private const string sonderzeichen = "\\\"\'µ@€!§$%&/()=?+#*',.-;:_><|{[]}´`^°~²³";
		private const string zahlen = "0123456789";
		private const string grossBuchstaben = "ABCDEFGHIJKLMNOPQRSTUVWXYZÄÖÜ";
		private const string kleinBuchstaben = "abcdefghijklmnopqrstuvwxyzäöüß";

		private void NeuesPwBox_OnPasswordChanged(object sender, RoutedEventArgs e)
		{
			var fehlermeldung = string.Empty;
			//textblock_editFailures.Foreground = new SolidColorBrush(Color.FromRgb(255, 72, 0));

			//if (!(NeuesPwBox.Password.Any(x => sonderzeichen.Contains(x)) && NeuesPwBox.Password.Any(x => zahlen.Contains(x)) && NeuesPwBox.Password.Any(x => grossBuchstaben.Contains(x)) && NeuesPwBox.Password.Any(x => kleinBuchstaben.Contains(x))))
			//	fehlermeldung = "Das Passwort sollte Sonderzeichen, Zahlen, Groß- und Kleinbuchstaben enthalten";
			
			//if (NeuesPwBox.Password.Length < 8)
			//	fehlermeldung = "Das Passwort sollte mindestens 8 Zeichen lang sein";

			textblock_editFailures.Text = fehlermeldung;
		}
	}
}
