using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.SqlClient;
using System.Text.RegularExpressions;

namespace Commission
{
    public partial class Employees_add : Form
    {
        public Employees_add()
        {
            InitializeComponent();
            cbFill();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            Hide();
            Employees emp = new Employees();
            emp.Show();
            emp.Location = Location;
            DataBase.diagWrite("Переход на форму Сотрудники");
        }
        /// <summary>
        /// Проверка данных на корректность перед сохранением в БД
        /// </summary>
        /// <param name="check">Проверка пройдена (true) или нет (false)</param>
        public void checkData(ref bool check, string surname, string name, string patronymic, string phone, string birthday, int dolgnost, string login, string password)
        {
            int year = DateTime.Now.Year - 14;
            int month = DateTime.Now.Month;
            int day = DateTime.Now.Day;
            bool checkLogin = false;

            SqlDataReader sqlReader = null;
            SqlCommand command = new SqlCommand("SELECT login FROM Logins", DataBase.connection());
            sqlReader = command.ExecuteReader();
            while (sqlReader.Read())
            {
                string loginCheck = Convert.ToString(sqlReader["login"]).Remove(1, 3);
                if (login == loginCheck)
                {
                    checkLogin = true;
                    break;
                }
            }
            sqlReader.Close();

            try
            {
                if (!Regex.IsMatch(surname, @"^[А-Я][а-я]+$"))
                {
                    MessageBox.Show("Введите фамилию корректно!", "Добавление сотрудника", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                }
                else if (!Regex.IsMatch(name, @"^[А-Я][а-я]+$"))
                {
                    MessageBox.Show("Введите имя корректно!", "Добавление сотрудника", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                }
                else if (!Regex.IsMatch(patronymic, @"^[А-Я][а-я]+$"))
                {
                    MessageBox.Show("Введите отчество корректно!", "Добавление сотрудника", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                }
                else if (dolgnost == -1)
                {
                    MessageBox.Show("Выберете должность из списка!", "Добавление сотрудника", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                }
                else if (Convert.ToInt32(birthday.Substring(0, 4)) < year - 80 || Convert.ToInt32(birthday.Substring(0, 4)) > year
                    || Convert.ToInt32(birthday.Substring(5, 2)) > 12 || Convert.ToInt32(birthday.Substring(0, 4)) == year && Convert.ToInt32(birthday.Substring(5, 2)) > month
                    || Convert.ToInt32(birthday.Substring(0, 4)) == year && Convert.ToInt32(birthday.Substring(5, 2)) == month && Convert.ToInt32(birthday.Substring(8, 2)) > day)
                {
                    MessageBox.Show("Введите корректную дату рождения!", "Добавление сотрудника", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                }
                else if (!Regex.IsMatch(phone, @"^\+7 \(9[0-9]{2}\) [0-9]{3}-[0-9]{2}-[0-9]{2}$"))
                {
                    MessageBox.Show("Введите корректный номер телефона!", "Добавление сотрудника", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                }
                else if (login == "")
                {
                    MessageBox.Show("Введите логин корректно!", "Добавление сотрудника", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                }
                else if (checkLogin)
                {
                    MessageBox.Show("Логин занят!", "Добавление сотрудника", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                }
                else if (!Regex.IsMatch(password, @"^(?=.*[A-Z])(?=.*[a-z])[0-9A-Za-z]{5,}$"))
                {
                    MessageBox.Show("Введите пароль корректно!\nМинимум 5 символов\nМинимум 1 прописная латинская буква\nМинимум 1 заглавная латинская буква", "Добавление сотрудника", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                }
                else
                {
                    check = true;
                }
            }
            catch
            {
                MessageBox.Show("Возникла ошибка. Проверьте введённые данные!", "Добавление сотрудника", MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }
        }

        /// <summary>
        /// Добавление данных в БД
        /// </summary>
        private void fillTable()
        {
            string login;
            string password;
            login = t_login.Text;
            password = t_pass.Text;

            SqlCommand command = new SqlCommand("INSERT INTO Logins VALUES(@log, @pass)", DataBase.connection());
            command.Parameters.AddWithValue("log", login);
            command.Parameters.AddWithValue("pass", password);
            command.ExecuteNonQuery();

            int id_user = 0;
            SqlDataReader sqlReader = null;
            command = new SqlCommand("SELECT kod_user FROM Logins WHERE login = @log", DataBase.connection());
            command.Parameters.AddWithValue("log", login);
            sqlReader = command.ExecuteReader();
            while (sqlReader.Read())
            {
                id_user = Convert.ToInt32(sqlReader["kod_user"]);
                break;
            }
            sqlReader.Close();

            command = new SqlCommand("INSERT INTO [Employees] VALUES((@fam, @name, @otc, @tel, @date, @dolg, @kod)", DataBase.connection());
            command.Parameters.AddWithValue("fam", t_surname.Text);
            command.Parameters.AddWithValue("name", t_name.Text);
            command.Parameters.AddWithValue("otc", t_patr.Text);
            string date = birthday.Value.ToString("yyyy-MM-dd");
            command.Parameters.AddWithValue("date", $"{date}");
            command.Parameters.AddWithValue("dolg", cb_dolg.SelectedIndex+1);
            command.Parameters.AddWithValue("tel", t_phone.Text);
            command.Parameters.AddWithValue("user", id_user);
            command.ExecuteNonQuery();
        }
        /// <summary>
        /// Заполнение значений ComboBox
        /// </summary>
        private void cbFill()
        {
            SqlDataReader sqlReader = null;
            SqlCommand command = new SqlCommand("SELECT * FROM Dolgnosti", DataBase.connection());
            sqlReader = command.ExecuteReader();
            while (sqlReader.Read())
            {
                cb_dolg.Items.Add(sqlReader["Name_dolgnosti"]);
            }
            sqlReader.Close();
        }

        private void b_add_Click(object sender, EventArgs e)
        {
            bool check = false;
            checkData(ref check, t_surname.Text, t_name.Text, t_patr.Text, t_phone.Text, birthday.Value.ToString("yyyy-MM-dd"), cb_dolg.SelectedIndex, t_login.Text, t_pass.Text);
            if (check)
            {
                fillTable();
                MessageBox.Show("Сотрудник успешно добавлен!", "Добавление сотрудника", MessageBoxButtons.OK, MessageBoxIcon.Information);
                t_name.Text = "";
                t_surname.Text = "";
                t_patr.Text = "";
                birthday.Text = "";
                t_phone.Text = "";
                cb_dolg.Text = null;
                t_login.Text = "";
                t_pass.Text = "";
            }
        }

        private void Employees_add_Load(object sender, EventArgs e)
        {

        }

        private void Employees_add_FormClosed(object sender, FormClosedEventArgs e)
        {
            Application.Exit();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            if (t_pass.UseSystemPasswordChar == false)
            {
                t_pass.UseSystemPasswordChar = true;
            }
            else
            {
                t_pass.UseSystemPasswordChar = false;
            }
        }
    }
}
