using System;
using System.ComponentModel;
using System.Windows.Forms;
using Tamir.SharpSsh;

namespace prog_tesztelo
{
	/// <summary>
	/// A törlés folyamatjelzője
	/// </summary>
	/// <remarks>
	/// A formon nyomon követhető a fájltranszfer aktuális állapota, valamint általános fájlinformációk.
	/// A 'Mégse' gombra kattintva megszakítható a folyamat.
	/// </remarks>
    public partial class DeleteForm : Form
    {
		/// <summary>
		/// Az aktuális fájlinformációk
		/// </summary>
        public DeleterSettings settings;

		/// <summary>
		/// A folyamat állapota százalékban kifejezve
		/// </summary>
		public int progressValue = 0;

		/// <summary>
		/// Delegátus, amellyel adatokat továbbítunk a fő formnak
		/// </summary>
		public RefreshDelegate DeleteDataCallback;

		/// <summary>
		/// A konstruktorban kapjuk a törlendő állományok információit, és ez alapján végrehajtjuk a törlést
		/// </summary>
		/// <param name="checkeditems">a törlendő elemek listája</param>
		/// <param name="root">a gyökérkönyvtár amelyből törlünk</param>
		/// <param name="local">igaz érték esetén helyi fájlokat törlünk, hamis érték esetén a szerveren törlünk</param>
		/// <param name="pattern">az SshShell által kimenetként várt minta</param>
		/// <param name="ssh">az SshShell objektum amivel a szerverről törlünk</param>
        public DeleteForm(ListView.ListViewItemCollection checkeditems, string root, bool local, string pattern, SshShell ssh)
        {
            InitializeComponent();

            try
            {
                settings = new DeleterSettings(checkeditems, root, local, ssh, pattern);
                label4.Text = "0%";
                label5.Text = string.Empty;

                // Megkezdjük a törlést
                deleter1.RunWorkerAsync(settings);
            }
            catch (Exception)
            {
                MessageBox.Show("Hiba a törlés során.");
                if (this.InvokeRequired)
                {
                    this.BeginInvoke((MethodInvoker)delegate() { this.Close(); });
                }
                else
                {
                    this.Close();
                }
            }
        }
       
		/// <summary>
		/// A folyamat százalékos visszajelzése a progressbaron
		/// </summary>
		/// <param name="sender"></param>
		/// <param name="e"></param>
        private void deleter1_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            progressBar1.Value = e.ProgressPercentage;
            progressValue = e.ProgressPercentage;
            label4.Text = e.ProgressPercentage + "%";
            label5.Text = e.UserState.ToString();
        }

		/// <summary>
		/// A fájlátvitel végén, vagy a folyamat megszakítása során végzendő műveletek 
		/// </summary>
		/// <param name="sender"></param>
		/// <param name="e"></param>
        private void deleter1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            // A folyamat aktuális állapotának kijelzése
            progressBar1.Value = progressValue;
            label4.Text = progressValue + "%";

            // Callback meghívása a login adatokkal
            if (DeleteDataCallback != null)
            {
                // Form elrejtése, majd az adatok továbbítása a főformnak.
                if (this.InvokeRequired)
                {
                    this.BeginInvoke((MethodInvoker)delegate() { this.Hide(); });
                }
                else
                {
                    this.Hide();
                }
                DeleteDataCallback();
            }

            // Form bezárása
            if (this.InvokeRequired)
            {
                this.BeginInvoke((MethodInvoker)delegate() { this.Close(); });
            }
            else
            {
                this.Close();
            }
        }

		/// <summary>
		/// A 'Mégse' gombra kattintva, vagy bezárva a formot megszakítjuk a kapcsolatot, és bezárjuk a formot.
		/// </summary>
		/// <param name="sender"></param>
		/// <param name="e"></param>
        private void button1_Click(object sender, EventArgs e)
        {
            deleter1.CancelAsync();
            DeleteDataCallback();
            this.Close();
        }

		/// <summary>
		/// A form bezárása esetén megszakítjuk a törlés folyamatát
		/// </summary>
		/// <param name="sender"></param>
		/// <param name="e"></param>
        private void Form6_FormClosing(object sender, FormClosingEventArgs e)
        {
            deleter1.CancelAsync();
            DeleteDataCallback();
        }
    }
}
