using CapchaLibrary;
using OOO_WriteAndClear.DBModels;
using OOO_WriteAndClear.EventBus.Signals;
using OOO_WriteAndClear.MVP.MVPInterfaces;
using OOO_WriteAndClear.MVP.Presenters;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
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;
using System.Windows.Threading;
namespace OOO_WriteAndClear.MVP.Views
{
///
/// Логика взаимодействия для AuthorizationUserControl.xaml
///
public partial class AuthorizationUserControl : UserControl, IAuthorizationContract.IView
{
public AuthorizationUserControl()
{
InitializeComponent();
_presenter = new AuthorizationUserControlPresenter(this);
_dispatcherTimer = new DispatcherTimer();
_dispatcherTimer.Tick += EnableButton;
_dispatcherTimer.Interval = new TimeSpan(0, 0, 10);
}
#region Реализация IAuthorizationContract.IView
///
/// Вывести сообщение о провале авторизации
///
public void ShowFailureAuthorizeMessage()
{
MessageBox.Show("Провал авторизации!",
"Пользователя не существует, проверьте правильность написания логина и пароля",
MessageBoxButton.OK,
MessageBoxImage.Error);
Dispatcher.BeginInvoke(new Action(() =>
{
if (_capchaCode is not null)
DisableButtonAndStartTimer();
UpdateCapcha();
CapchaStackPanel.Visibility = Visibility.Visible;
})).Wait();
}
///
/// Выполняет действия необходимые для входа пользователя в систему
///
/// Авторизованный пользователь
public void LetInAuthorizedUser(User user)
{
Dispatcher.BeginInvoke(new Action(() =>
{
EventBus.EventBus.GetService().Invoke(new UserWasLoggedSignal(user));
}));
}
#endregion
public string Login { get => LoginField.Text; set => LoginField.Text = value; }
public string Password { get => PasswordField.Password; set => PasswordField.Password = value; }
private readonly IAuthorizationContract.IPresenter _presenter;
private string? _capchaCode = null;
private readonly DispatcherTimer _dispatcherTimer;
#region Обработчики событий разметки
///
/// Обработчик события нажатия на кнопку авторизации
///
/// Кнопка
/// Аргументы события
private void LoginButton_Click(object sender, RoutedEventArgs e)
{
if (_capchaCode is not null && _capchaCode != CapchaCodeTextBox.Text)
{
MessageBox.Show("Капча введена не верно!", "Капча", MessageBoxButton.OK);
UpdateCapcha();
DisableButtonAndStartTimer();
return;
}
string login = Login;
string password = Password;
Task.Run(() =>
{
_presenter.CheckTheUser(login, password);
});
}
///
/// Обработчик события нажатия на ссылку входа как гость
///
/// Ссылка
/// Аргументы события
private void LoginAsGuestLink_Click(object sender, RoutedEventArgs e)
{
EventBus.EventBus.GetService().Invoke(new UserWasLoggedSignal(new User() { UserId = -1 })); //ID = -1, так как пользователь не авторизован
}
private void RefreshCapcha_Click(object sender, RoutedEventArgs e)
{
UpdateCapcha();
}
#endregion
private void UpdateCapcha()
{
CapchaData capchaData = new CapchaGenerator().GenerateCapcha();
_capchaCode = capchaData.Code;
BitmapImage bitmapimage = new BitmapImage();
using (MemoryStream memory = new MemoryStream())
{
capchaData.CapchaImage.Save(memory, System.Drawing.Imaging.ImageFormat.Bmp);
memory.Position = 0;
bitmapimage.BeginInit();
bitmapimage.StreamSource = memory;
bitmapimage.CacheOption = BitmapCacheOption.OnLoad;
bitmapimage.EndInit();
}
CapchaImage.Source = bitmapimage;
}
private void DisableButtonAndStartTimer()
{
AuthButton.IsEnabled = false;
_dispatcherTimer.Start();
}
private void EnableButton(object sender, EventArgs e)
{
AuthButton.IsEnabled = true;
}
}
}