using System;
using System.Text.RegularExpressions;
using System.Windows.Forms;
using HISP.Security;
using HISP.Server;

namespace HISP.Noobs
{
    public partial class ResetForm : Form
    {
        public ResetForm()
        {
            InitializeComponent();
        }

        private void RegisterForm_Load(object sender, EventArgs e)
        {
            ValidateInput();
        }

        private void ValidateInput()
        {
            if(ValidateUsername() && ValidatePassword())
                ResetPassword.Enabled = true;
            else
                ResetPassword.Enabled = false;
        }

        private bool ValidatePassword()
        {
            int selStart = Password.SelectionStart;
            int selLen = Password.SelectionLength;
            Password.Text = Regex.Replace(Password.Text, "[^A-Za-z0-9]", "");
            Password.SelectionStart = selStart;
            Password.SelectionLength = selLen;

            if (Password.Text.Length < 6)
            {
                PasswordValidationFailReason.Text = "- Password must be more than 6 characters.";
                return false;
            }

            if (Password.Text.Length >= 16)
            {
                PasswordValidationFailReason.Text = "- Password must be less than 16 characters.";
                return false;
            }

            PasswordValidationFailReason.Text = "";
            return true;
        }

        private bool ValidateUsername()
        {
            int selStart = Username.SelectionStart;
            int selLen = Username.SelectionLength;
            Username.Text = Regex.Replace(Username.Text, "[^A-Za-z]", "");
            Username.SelectionStart = selStart;
            Username.SelectionLength = selLen;

            if (Username.Text.Length < 3)
            {
                UsernameValidationFailReason.Text = "- Username must be more than 3 characters.";
                return false;
            }

            if (Username.Text.Length >= 16)
            {
                UsernameValidationFailReason.Text = "- Username must be less than 16 characters.";
                return false;
            }

            if (Regex.IsMatch(Username.Text, "[A-Z]{2,}"))
            {
                UsernameValidationFailReason.Text = "- Username have the first letter of each word capitalized.";
                return false;
            }

            if (Username.Text.ToUpper()[0] != Username.Text[0])
            {
                UsernameValidationFailReason.Text = "- Username have the first letter of each word capitalized.";
                return false;
            }

            if (!Database.CheckUserExist(Username.Text))
            {
                UsernameValidationFailReason.Text = "- Username not found.";
                return false;
            }

            UsernameValidationFailReason.Text = "";
            return true;
        }

        private void Username_TextChanged(object sender, EventArgs e)
        {
            ValidateInput();
        }

        private void Password_TextChanged(object sender, EventArgs e)
        {
            ValidateInput();
        }

        private void ResetPassword_Click(object sender, EventArgs e)
        {
            // Get salt
            byte[] salt = Database.GetPasswordSalt(Username.Text);

            // Hash password
            string hashsalt = BitConverter.ToString(Authentication.HashAndSalt(Password.Text, salt)).Replace("-", "");

            Database.SetPasswordHash(Username.Text, hashsalt);
            this.DialogResult = DialogResult.OK;
        }
        private void Password_KeyPress(object sender, KeyPressEventArgs e)
        {
            if(e.KeyChar == (char)Keys.Return)
            {
                if (ResetPassword.Enabled)
                {
                    e.Handled = true;
                    ResetPassword_Click(null, null);
                }

            }

        }

        private void Username_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar == (char)Keys.Return)
            {
                if (ResetPassword.Enabled)
                {
                    e.Handled = true;
                    ResetPassword_Click(null, null);
                }

            }
        }

    }
}