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.Security.Cryptography;
using System.Data.Common;
using Percent___Qualification_work.Classes;
using System.Data.Odbc;
using Percent___Qualification_work.Forms;

namespace Percent___Qualification_work
{
    public partial class LoginForm : Form
    {

        public LoginForm()
        {
            InitializeComponent();

            SUbutton.Enabled = false;
            Lbutton.Enabled = false;

            SUusername.TextChanged += new EventHandler(enableSUButton);
            SUpassword.TextChanged += new EventHandler(enableSUButton);
            SUpassword1.TextChanged += new EventHandler(enableSUButton);
            Lusername.TextChanged += new EventHandler(enableLbutton);
            Lpassword.TextChanged += new EventHandler(enableLbutton);


        }
        
        //SIGNUP

        // Check if all input fields in signup window are not empty to enable the signup button
        private void enableSUButton(object sender, EventArgs e)
        {
            SUbutton.Enabled = !string.IsNullOrEmpty(SUusername.Text) &&
                               !string.IsNullOrEmpty(SUpassword.Text) &&
                               !string.IsNullOrEmpty(SUpassword1.Text);
        }

        private void LoginForm_Load(object sender, EventArgs e)
        {
            this.Lusername.AutoSize = this.Lpassword.AutoSize = this.SUusername.AutoSize = this.SUpassword.AutoSize = this.SUpassword1.AutoSize = false;
            this.Lusername.Size = this.Lpassword.Size = this.SUusername.Size = this.SUpassword.Size = this.SUpassword1.Size = new System.Drawing.Size(156,26);
        }

        // Display SignUp window when "Don't have an account yet?" text is clicked
        private void LtoSU_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            Lpanel.Visible = false;
        }

        // Display Login window when "Already have an account?" text is clicked
        private void SUtoL_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            Lpanel.Visible=true;
        }

        private void SUbutton_Click(object sender, EventArgs e)
        {
            string[] checkSymbols = { "!", "@", "#", "$", "%", "^", "&", "*", "(", ")" };
    
            // Collect data from input fields
            string username = SUusername.Text;
            string password = SUpassword.Text;
            string password1 = SUpassword1.Text;

            // Check if password meets all requirements
            bool isValidPassword = password.Length >= 8 &&
                                   checkSymbols.Any(symbol => password1.Contains(symbol)) &&
                                   password.Any(char.IsDigit) &&
                                   password.Any(char.IsUpper);
            
            // Check if the password don't match
            if (password != password1 )
            {
                isValidPassword = false;
                MessageBox.Show("Passwords do not match!");
                return;
            }

            // Check if an account with this username doesnt exist
            if (DatabaseConnection.Instance.IsUsernameTaken(username))
            {
                MessageBox.Show("Username is already taken, please choose a different one.");
                return; 
            }


            if (isValidPassword)
            {
                bool isRegistered = Authentication.Instance.Register(username, password);

                if(isRegistered) 
                {
                    MessageBox.Show("Registration successful! Please log in!");
                    SUusername.Text = "";
                    SUpassword.Text = "";
                    SUpassword1.Text = "";
                    Lpanel.Visible = true;
                }
                else
                {
                    MessageBox.Show("There was an error creating an account! Try again later...");
                }


            }
            else
            {
                string errorMessage = "Your password:\n";
                if (password1.Length < 8) errorMessage += "- Must be at least 8 characters long\n";
                if (!checkSymbols.Any(symbol => password1.Contains(symbol))) errorMessage += "- Is missing a special symbol (!, @, #, $, etc.)\n";
                if (!password1.Any(char.IsDigit)) errorMessage += "- Is missing atleast one number\n";
                if (!password1.Any(char.IsUpper)) errorMessage += "- Is missing atleast one uppercase letter";

                MessageBox.Show(errorMessage);

            }

        }

        // Shows a message with all the password requirements
        private void passwordClue_Click(object sender, EventArgs e)
        {
            MessageBox.Show("Password must: \n" +
                "Be atleast 8 symbols long\n" +
                "Contain atleast 1 number\n" +
                "Contain atleast 1 uppercase letter\n" +
                "Contain atleast 1 special symbol(!,@,#,$,%,^,&,*,(,))");
        }


        //LOGIN


        // enables login button if both input fields are not empty
        private void enableLbutton(object sender, EventArgs e)
        {
            Lbutton.Enabled = !string.IsNullOrEmpty(Lusername.Text) &&
                              !string.IsNullOrEmpty(Lpassword.Text);  
        }

        // Checks user data and proceeds to main page
        private void Lbutton_Click(object sender, EventArgs e)
        {
            string username = Lusername.Text;
            string password = Lpassword.Text;

            if (Authentication.Instance.Login(username, password))
            {
                MessageBox.Show("Login successful!");

                this.DialogResult = DialogResult.OK;


                this.Close();
            }
        }



    }
}
