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

namespace prog_tesztelo
{
    public partial class Viewer : BackgroundWorker
    {
		/// <summary>
		/// A BackgroundWorker objektum, amely segítségével a háttérben végezzük a megtekintendő/szerkesztendő fájl letöltését/feltöltését,
		/// így a fő form futása nem akad meg a folyamat végrehajtása során
		/// </summary>
		private static BackgroundWorker bw;
		
		/// <summary>
		/// A nézőkében/szerkesztőben megnyitni kívánt fájlra vonatkozó főbb információk
		/// </summary>
		private static ViewerSettings viewerSettings;

		/// <summary>
		/// Az Scp kapcsolatért felelős objektum, amely biztosítja a fájlátvitelt a szerver és a számítógép között
		/// </summary>
		/// <remarks>
		/// Az Scp osztály három eseménykezelőt biztosít:
		///		scp_OnTransferStart
		///		scp_OnTransferProgress
		///		scp_OnTransferEnd
		/// </remarks>
		private static Scp scp;

		/// <summary>
		/// Az alapértelmezett konstruktor
		/// </summary>
        public Viewer()
        {
            InitializeComponent();
        }

		/// <summary>
		/// A paraméterként kapott konténerhez hozzáadjuk a Backgroundworker objektumunkat, így a továbbiakban
		/// a containerből vezérelhetjük a műveleteket
		/// </summary>
		/// <param name="container"></param>
		public Viewer(IContainer container)
		{
			container.Add(this);
			InitializeComponent();
		}

		/// <summary>
		/// A BackgroundWorker fő eseménykezelője
		/// </summary>
		/// <param name="sender"></param>
		/// <param name="e"></param>
        private void Viewer_DoWork(object sender, DoWorkEventArgs e)
        {
            try
            {
                bw = sender as BackgroundWorker;
                viewerSettings = e.Argument as ViewerSettings;

				scp = new Scp(viewerSettings.Host, viewerSettings.User, viewerSettings.Pass);

                scp.OnTransferStart += new FileTransferEvent(scp_OnTransferStart);
                scp.OnTransferProgress += new FileTransferEvent(scp_OnTransferProgress);
                scp.OnTransferEnd += new FileTransferEvent(scp_OnTransferEnd);

				// ha újból letöltjük a fájlt, amit már egyszer megtekintettünk/szerkesztettünk
				// az alkalmazás futtatása során, akkor csak a legfrissebb állományt tároljuk
                if (viewerSettings.Upload == false && File.Exists(viewerSettings.Tempfilename))
                {
                    File.SetAttributes(viewerSettings.Tempfilename, FileAttributes.Normal);
                    File.Delete(viewerSettings.Tempfilename);
                }

				scp.Connect();

				// Az Upload tag határozza meg a fájlátvitel irányát, ha értéke igaz, akkor a szerverre töltünk fel,
				// ha hamis, akokr a szerverről töltünk le.
				if (viewerSettings.Upload == true)
				{
					scp.To(viewerSettings.Tempfilename, viewerSettings.Selectedfile);
				}
				else
				{
					scp.From(viewerSettings.Selectedfile, viewerSettings.Tempfilename);
				}
				if (scp.Connected) scp.Close();
            }
            catch (Exception exc)
            {
                MessageBox.Show("Hiba a folyamat végrehajtása során." + exc.Message);
            }
        }

		/// <summary>
		/// A fájlátvitel kezdetét vezérlő eseménykezelő - nullázza a ProgressBar értékét
		/// </summary>
		/// <param name="src">a forrás elérési útvonala</param>
		/// <param name="dst">a cél elérési útvonala</param>
		/// <param name="transferredBytes">az átvitt bájtok száma</param>
		/// <param name="totalBytes">az összes bájt</param>
		/// <param name="message">az üzenet</param>
        void scp_OnTransferStart(string src, string dst, int transferredBytes, int totalBytes, string message)
        {
			bw.ReportProgress(0);
			if (bw.CancellationPending)
			{
				scp.Cancel();
			}
        }

		/// <summary>
		/// A fájlátvitel folyamatát vezérlő eseménykezelő - közli a folyamat állapotát a ProgressBar-on
		/// </summary>
		/// <param name="src">a forrás elérési útvonala</param>
		/// <param name="dst">a cél elérési útvonala</param>
		/// <param name="transferredBytes">az átvitt bájtok száma</param>
		/// <param name="totalBytes">az összes bájt</param>
		/// <param name="message">az üzenet</param>
        void scp_OnTransferProgress(string src, string dst, int transferredBytes, int totalBytes, string message)
        {
			bw.ReportProgress((totalBytes == 0) ? 0 : (transferredBytes * 100 / totalBytes));
			if (bw.CancellationPending)
			{
				scp.Cancel();
			}
        }

		/// <summary>
		/// A fájlátvitel végét vezérlő eseménykezelő - visszajelzi a folyamat sikerességét a ProgressBar-on
		/// </summary>
		/// <param name="src">a forrás elérési útvonala</param>
		/// <param name="dst">a cél elérési útvonala</param>
		/// <param name="transferredBytes">az átvitt bájtok száma</param>
		/// <param name="totalBytes">az összes bájt</param>
		/// <param name="message">az üzenet</param>
        void scp_OnTransferEnd(string src, string dst, int transferredBytes, int totalBytes, string message)
        {
			bw.ReportProgress((totalBytes == 0) ? 0 : (transferredBytes * 100 / totalBytes));
			if (bw.CancellationPending)
			{
				scp.Cancel();
			}
        }
    }
}