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

namespace prog_tesztelo
{
	/// <summary>
	/// Letöltés/feltöltés folyamatjelzője
	/// </summary>
	/// <remarks>
	/// A formon nyomon követhető a fájltranszfer aktuális állapota, valamint az általános fájlinformációk.
	/// A 'Mégse' gombra kattintva megszakítható a folyamat.
	/// </remarks>
    public partial class DownloadForm : Form
    {
		/// <summary>
		/// Igaz érték esetén szerkesztjük a fájlt, hamis érték esetén csak megtekintjük a beállított nézőkével
		/// </summary>
        public bool editable;

		/// <summary>
		/// Igaz érték esetén feltöltjük, hamis érték esetén letöltjük a fájlt
		/// </summary>
		public bool upload;

		/// <summary>
		/// Az aktuális fájlra vonatkozó információk
		/// </summary>
        public ViewerSettings 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 DownloadDelegate DownloadCallback;

		/// <summary>
		/// A konstruktorban kapjuk az aktuális fájl információit, amelyet letöltünk vagy feltöltünk a paraméterben megadott értékeknek megfelelően
		/// </summary>
		/// <param name="vs">a fájlra vonatkozó információk</param>
        public DownloadForm(ViewerSettings vs)
        {
            InitializeComponent();

            try
            {
                settings = vs;
                label4.Text = "0%";

                editable = vs.Editable;
                upload = vs.Upload;

                // Módosítjuk a feliratokat az állománymozgatás irányának megfelelően
                if (upload)
                {
                    this.Text = "Feltöltés";
                    label1.Text = "Feltöltés";
					label5.Text = vs.Tempfilename;	// Forrás
					label6.Text = vs.Selectedfile;	// Cél
                }
                else
                {
                    this.Text = "Letöltés";
					label1.Text = "Letöltés";
					label5.Text = vs.Selectedfile;	// Forrás
					label6.Text = vs.Tempfilename;	// Cél
                }

                // Megkezdjük az állománymozgatást
                viewer1.RunWorkerAsync(vs);
            }
            catch (Exception)
            {
                MessageBox.Show("Hiba az állományátvitel 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 viewer1_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            progressBar1.Value = e.ProgressPercentage;
            progressValue = e.ProgressPercentage;
            label4.Text = e.ProgressPercentage + "%";
        }

		/// <summary>
		/// A fájlátvitel végén, vagy a folyamat megszakítása esetén továbbítjuk az adatokat a fő form felé és bezárjuk a formot
		/// </summary>
		/// <param name="sender"></param>
		/// <param name="e"></param>
        private void viewer1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            // A folyamat aktuális állapotának kijelzése
            progressBar1.Value = progressValue;
            label4.Text = progressValue + "%";

            bool success;
            bool edit;

            // Ha a folyamat 100%-nál fejeződött be, sikeres volt, különben a fájlátvitel sikertelen
            success = ( progressValue == 100 ? true : false );

            // Ha a fájlt szerkesztésre nyitottuk meg, ezt jelezzük a callback delegátusnak.
			edit = ( settings.Editable ? true : false );

            // Callback meghívása a login adatokkal
            if (DownloadCallback != 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();
                }
                DownloadCallback(success, edit, settings);
            }

            // 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)
        {
            viewer1.CancelAsync();
            this.Close();
        }

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