using System;
using System.Windows.Forms;

namespace prog_tesztelo
{
	/// <summary>
	/// A szerverhez történő csatlakozásnál a felhasználói adatok megadására szolgál
	/// </summary>
	/// <remarks>
	/// Főbb vezérlők:
	///		serverTitle             -   'Szerver:' felirat (Label)
	///		serverAddressTextBox    -   szerver címe, amelyhez csatlakozunk (TextBox)
	///		userTitle               -   'Felhasználói név:' felirat (Label)
	///		usernameTextBox         -   felhasználói név (TextBox)
	///		usernameError           -   hibás felhasználói név esetén megjelenő * (Label)
	///		passwordTitle           -   'Jelszó:' felirat (Label)
	///		passwordTextBox         -   jelszó (TextBox)
	///		passwordError           -   hibás jelszó esetén megjelenő * (Label)
	///		rememberPasswordCheckbox-   bejelölése esetén újbóli bejelentkezésnél nem kell megadni a felhasználói adatokat
	///		errorLabel              -   hiba esetén a hiba oka (Label)
	///		connectOK               -   'Csatlakozás' gomb
	///		connectCancel           -   'Mégse' gomb
	/// </remarks>
    public partial class ConnectForm : Form
    {
		/// <summary>
		/// Callback delegátus a bejelentkezési adatok továbbítására a fő form felé
		/// </summary>
        public ConnectDataDelegate ConnectDataCallback;

		/// <summary>
		/// Az alapértelmezett konstruktor
		/// </summary>
		/// <remarks>
		/// Első csalakozáskor nem adunk meg paramétereket a konstruktornak, 
		/// a bejelentkezéshez szükséges adatokat a felhasználótól várjuk
		/// </remarks>
        public ConnectForm()
        {
            InitializeComponent();
        }

		/// <summary>
		/// Újracsatlakozás létező adatokkal
		/// </summary>
		/// <remarks>
		/// A konstruktor paramétereit használjuk az újracsatlakozás megkönnyítéséhez.
		/// Az alkalmazás futása alatt amikor valamilyen hiba folytán megszakad a kapcsolat, az újracsatlakozás
		/// megkönnyítéséhez az eredeti adatokat jelenítjük meg a formban, így az 'OK' gombra kattintva
		/// megtörtént az újracsatlakozás.
		/// </remarks>
		/// <param name="serverAddress">a szerver címe, amelyhez csatlakozunk</param>
		/// <param name="username">a felhasználói név</param>
		/// <param name="password">a jelszó</param>
        public ConnectForm(string serverAddress, string username, string password)
        {
            try
            {
                InitializeComponent();
            }
            catch (Exception)
            {
                MessageBox.Show("Hiba a form inicializálása közben.");
                this.Close();
            }

            try
            {
                // Beállítjuk a szerver címét (ha nem olvasható be a szerver címe, akkor nem engedjük meg a csatlakozást
                if (serverAddress.Trim() == string.Empty)
                {
                    serverAddressTextBox.Text = "< Hiányzó szervercím! >";
                    connectOK.Enabled = false;
                }
                else
                {
                    serverAddressTextBox.Text = serverAddress;
                }

                // A hibajelző Label-eket elrejtjük
                usernameError.Visible = false;
                passwordError.Visible = false;
                errorLabel.Visible = false;

                usernameTextBox.Text = username;
                passwordTextBox.Text = password;
            }
            catch { }
        }

		/// <summary>
		/// Form bezárása a 'Mégse' gombra kattintva
		/// </summary>
		/// <param name="sender"></param>
		/// <param name="e"></param>
        private void connectCancel_Click(object sender, EventArgs e)
        {
            Close();
        }

		/// <summary>
		/// Csatlakozás a szerverhez
		/// </summary>
		/// <remarks>
		/// Feldolgozzuk a megadott adatokat, és csak helyesen megadott adatok esetén engedjük meg a csatlakozást
		/// </remarks>
		/// <param name="sender"></param>
		/// <param name="e"></param>
        private void connectOK_Click(object sender, EventArgs e)
        {
            try
            {
                // Hibakezelés
                // ha nem adtunk meg felhasználóinevet
                if (usernameTextBox.Text.Trim() == String.Empty)
                {
                    // hibajelző feliratok beállítása
                    if (!errorLabel.Visible) errorLabel.Visible = true;
                    if (!usernameError.Visible) usernameError.Visible = true;
                    if (passwordError.Visible) passwordError.Visible = false;

                    // a fókuszt a felhasználói névre állítjuk
                    usernameTextBox.Focus();

                    // beállítjuk a hibaüzenetet
                    errorLabel.Text = "* Kérem adjon meg egy felhasználói nevet!";
                }
                // ha nem adtunk meg jelszót
                else if (passwordTextBox.Text.Trim() == String.Empty)
                {
                    // hibajelző feliratok beállítása
                    if (!errorLabel.Visible) errorLabel.Visible = true;
                    if (usernameError.Visible) usernameError.Visible = false;
                    if (!passwordError.Visible) passwordError.Visible = true;

                    // a fókuszt a jelszóra állítjuk
                    passwordTextBox.Focus();

                    // beállítjuk a hibaüzenetet
                    errorLabel.Text = "* Kérem adja meg a jelszót!";
                }
                else
                {
                    Cursor.Current = Cursors.WaitCursor;

                    // Callback meghívása a login adatokkal
                    if (ConnectDataCallback != null)
                    {
                        ConnectDataCallback(serverAddressTextBox.Text, usernameTextBox.Text, passwordTextBox.Text);
                    }

                    Cursor.Current = Cursors.Arrow;

                    // Csatlakozás után az ablak bezárása
                    Close();
                }
            }
            catch (Exception)
            {
                // hibajelző feliratok beállítása
                if (!errorLabel.Visible) errorLabel.Visible = true;
                if (usernameError.Visible) usernameError.Visible = false;
                if (passwordError.Visible) passwordError.Visible = false;

                // beállítjuk a hibaüzenetet
                errorLabel.Text = "Hiba a csatlakozás során.";
            }
        }
    }
}
