using System;
using System.ComponentModel;
using System.Windows.Forms;

namespace prog_tesztelo
{
	/// <summary>
	/// Másolás folyamatjelzője
	/// </summary>
	/// <remarks>
	/// A formon nyomon követhető a másolás aktuális állapota, valamint általános fájlinformációk.
	/// A 'Mégse' gombra kattintva megszakítható a folyamat.
	/// 
	/// Létező fájl/könyvtár esetén megjeleníti a felülírási teendőket kezelő formot. 
	/// 
	/// Figyelem! Amennyiben a szerveren egy létező könyvtárat kell felülírni, a könyvtár teljes tartalma kicserélődik
	/// (a gyorsabb fájlátvitel érdekében)
	/// </remarks>
    public partial class CopyForm : Form
    {
		/// <summary>
		/// A másolandó fájlokra/könyvtárakra vonatkozó információk
		/// </summary>
        public CopierSettings 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 CopyCallback;

		/// <summary>
		/// A konstruktorban kapjuk a másolandó fájlok listáját és a főbb információkat, amelyeket felhasználva elkezdjük a másolást
		/// </summary>
		/// <param name="checkeditems">a másolandó fájlok listája</param>
		/// <param name="from">a másolandó fájlok helye</param>
		/// <param name="to">a hely, ahova másolunk</param>
		/// <param name="local">igaz érték esetén a szerverre, hamis érték esetén a szerverről másolunk</param>
		/// <param name="host">a szerver címe</param>
		/// <param name="user">a csatlakozáshoz szükséges felhasználói név</param>
		/// <param name="pass">a csatlakozáshoz szükséges jelszó</param>
        public CopyForm(ListView.ListViewItemCollection checkeditems, string from, string to, bool local, string host, string user, string pass)
        {
            InitializeComponent();

            try
            {
                settings = new CopierSettings(checkeditems, from, to, local, host, user, pass);

                label3.Text = string.Empty;
                label4.Text = "0%";
                label5.Text = string.Empty;

                // Megkezdjük az állománymozgatást
                copier1.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 copier1_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            progressBar1.Value = e.ProgressPercentage;
            progressValue = e.ProgressPercentage;
            label4.Text = e.ProgressPercentage + "%";
			if (e.UserState != null)
			{
				label5.Text = e.UserState.ToString().Split(new string[] { @"--\\\--" }, StringSplitOptions.None)[0];
				label3.Text = e.UserState.ToString().Split(new string[] { @"--\\\--" }, StringSplitOptions.None)[1];
			}
        }

		/// <summary>
		/// A fájlátvitel végén, vagy a folyamat megszakítása esetén meghívjuk a callback függvényt és bezárjuk a formot
		/// </summary>
		/// <param name="sender"></param>
		/// <param name="e"></param>
        private void copier1_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 (CopyCallback != 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();
                }
                CopyCallback();
            }

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

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

		/// <summary>
		/// Bezárva a formot megszakítjuk a folyamatot, és bezárjuk a formot
		/// </summary>
		/// <param name="sender"></param>
		/// <param name="e"></param>
        private void Form6_FormClosing(object sender, FormClosingEventArgs e)
        {
            copier1.CancelAsync();
            CopyCallback();
        }
    }
}