using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Timers;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Navigation;

namespace WPF01.pages
{
    using db;

    /// <summary>
    /// Логика взаимодействия для Authorization.xaml
    /// </summary>
    public partial class Authorization : Page
    {

		// Количество неверно веденного пароля
		int count = 0;

        // Таймер, который будет отсчитывать время разблокировки
        // кнопки Вход в случае 3 неверных попыток ввода логин и пароля
		Timer timer = new Timer();

        // Конструктор окна авторизации
        public Authorization()
        {
            InitializeComponent();

            // Задать время счетчику 1 минута (60000 миллисекунд)
            timer.Interval = 60000;

            // Установить событие (функция Timeout) которое
            // будет вызвано, когда 1 минута пройдет
            // (после запуска timer.Start())
            timer.Elapsed += new ElapsedEventHandler(Timeout);
        }

        // Функция для вызова таймером
        void Timeout(object sender, ElapsedEventArgs e)
        {
            // Для доступа к кнопке необходим особый механизм
            // Диспетчер помещает в общую очередь задач
            // действие, которое будет вызвано в UI потоке.
            // В общем нужно просто запомнить эту запись
            Dispatcher.Invoke(new Action(() =>
            {
                // Включить кнопку
                buttonLogin.IsEnabled = true;
				// Остановить таймер
				timer.Stop();
			}));

            // Вместо записи () => {} можно было бы использовать
            // имя функции.
            // например, new Action(имяФункции)
        }

        private void ButtonClick(object sender, RoutedEventArgs e)
        {
            // Записать значение полей Логин и Пароль
            // в одтельные переменные для удобства использования
            string login = textBoxLogin.Text;
            string password = textBoxPassword.Password;

            // Проверить количество введенных символов
            // в поля Логин и Пароль
            if (login.Length < 4 || password.Length < 4)
            {
                return;
            }

            // Получить из таблицы Manager запись, которая соответствует
            // указанному логину и паролю (login, password)
            IQueryable<Manager> man = Database.Context.Manager.Where(
                m => m.Login == login && m.Password == password);

            // Из полученного результата попытаться взять первую запись
            Database.User = man.FirstOrDefault();
            if (Database.User == null)
            {
                // Если записей нет, то сказать пользователю
                // о неправильном вводе
                MessageBox.Show("Неверный логин/пароль");

                // Увеличить счетчик неверно введенного пароля на единицу
				count++;

                // Если счетчик достиг значения 3, то...
				if (count >= 3)
				{
                    // заблокировать кнопку Вход
					buttonLogin.IsEnabled = false;
                    // и запустить таймер на 1 минуту
                    // После 1 минуты таймер разблокирует кнопку
					timer.Start();
				}
                return;
            }

            // Если пользователь был получен (из базы данных)
            // то проверить его роль, и в соответствии с ролью
            // открыть нужную страницу
			switch (Database.User.Role)
			{
				case "Директор":
                    // Для роли Директор октрыть страницу "директор"
					NavigationService.Navigate(PageNavigation.director);
					break;

				case "Менеджер":
					NavigationService.Navigate(PageNavigation.mainPage);
					break;

				case "Администратор":
					NavigationService.Navigate(PageNavigation.mainPage);
					break;

				default:
					NavigationService.Navigate(PageNavigation.mainPage);
					break;
			}

            // На главном окне показать кнопку Мои данные
			PageNavigation.mainWindow.userInfoButton.Visibility = Visibility.Visible;
        }

        private void TextBoxInput(object sender, KeyEventArgs e)
        {
            if (textBoxLogin.Text.Length >= 4 && textBoxPassword.Password.Length >= 4)
            {
                buttonLogin.IsEnabled = true;
            }
            else
            {
                buttonLogin.IsEnabled = false;
            }
        }

        private void Label_MouseUp(object sender, MouseButtonEventArgs e)
        {
            NavigationService.Navigate(PageNavigation.registration);
        }

    }
}
