using System;
using System.ComponentModel;
using System.IO;
using System.Windows.Forms;
using Microsoft.VisualBasic.FileIO;
using Tamir.SharpSsh;

namespace prog_tesztelo
{
    public partial class Deleter : BackgroundWorker
    {
		/// <summary>
		/// A BackgroundWorker objektum, amely segítségével a háttérben végezzük a törlést,
		/// így a fő form futása nem akad meg a folyamat végrehajtása során
		/// </summary>
		private static BackgroundWorker bw;

		/// <summary>
		/// A törlendő fájlok listája és a rájuk vonatkozó információk
		/// </summary>
		private static DeleterSettings deleterSettings;

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

		/// <summary>
		/// A konstruktorban a paraméterként kapott konténerhez hozzáadjuk az osztály aktuális példányát
		/// </summary>
		/// <remarks>
		/// Ezt a Deleter objektumot a DeleteForm használja fel a háttérszálon történő törléshez,
		/// hogy a folyamat ideje alatt a fő szál ne blokkolódjon, és a felhasználó kapjon visszajelzést
		/// a folyamat aktuális állapotáról
		/// </remarks>
		/// <param name="container"></param>
		public Deleter(IContainer container)
		{
			container.Add(this);
			InitializeComponent();
		}
		
		/// <summary>
		/// A BackgroundWorder háttérszálon futó eseménykezelője, amely elvégzi a törlést
		/// </summary>
		/// <param name="sender"></param>
		/// <param name="e"></param>
        private void Deleter_DoWork(object sender, DoWorkEventArgs e)
        {
            try
            {
                bw = sender as BackgroundWorker;
                deleterSettings = e.Argument as DeleterSettings;

                double iss = 0;
                double d = 100 / deleterSettings.Selectedfile.Count;

                foreach (ListViewItem i in deleterSettings.Selectedfile)
                {
                    iss += d;
                    bw.ReportProgress((int)iss, i.Text);
                    if (!bw.CancellationPending)
                    {
                        if (!deleterSettings.IsLocal)
                        {
                            // megvizsgáljuk, hogy van-e kijelölt elem, és biztosítjuk, hogy 
                            // a ".." könyvtár nem törölhető
                            if (i != null && i.SubItems[0].Text != "..")
                            {
                                // ha könyvtárat törlünk
                                if (i.SubItems[1].Text == "<dir>" && (i.SubItems[3].Text.Substring(0, 3).Equals("drw")))
                                {
									deleterSettings.Ssh.WriteLine(("rm -r \"" + deleterSettings.Root + "/" + i.SubItems[0].Text + "\""));
                                }
                                // ha fájlt törlünk
                                else
                                {
                                    deleterSettings.Ssh.WriteLine(("rm \"" + deleterSettings.Root + "/" + i.SubItems[0].Text + "\""));
                                }
                                read();
                            }
                        }
                        else
                        {
                            // megvizsgáljuk, hogy van-e kijelölt elem, és biztosítjuk, hogy 
                            // a ".." könyvtár nem törölhető
                            if (i != null && i.SubItems[0].Text != "..")
                            {
                                // ha könyvtárat törlünk
                                if (i.SubItems[1].Text == "<dir>")
                                {
                                    if (deleterSettings.Root[deleterSettings.Root.Length - 1] == Path.DirectorySeparatorChar)
                                    {
										FileSystem.DeleteDirectory(deleterSettings.Root + i.SubItems[0].Text, UIOption.OnlyErrorDialogs, RecycleOption.SendToRecycleBin, UICancelOption.DoNothing);
                                    }
                                    else
                                    {
										FileSystem.DeleteDirectory(deleterSettings.Root + Path.DirectorySeparatorChar + i.SubItems[0].Text, UIOption.OnlyErrorDialogs, RecycleOption.SendToRecycleBin, UICancelOption.DoNothing);
                                    }
                                }
                                // ha fájlt törlünk
                                else
                                {
                                    if (deleterSettings.Root[deleterSettings.Root.Length - 1] == Path.DirectorySeparatorChar)
                                    {
										FileSystem.DeleteFile(deleterSettings.Root + i.SubItems[0].Text, UIOption.OnlyErrorDialogs, RecycleOption.SendToRecycleBin, UICancelOption.DoNothing);
                                    }
                                    else
                                    {
										FileSystem.DeleteFile(deleterSettings.Root + Path.DirectorySeparatorChar + i.SubItems[0].Text, UIOption.OnlyErrorDialogs, RecycleOption.SendToRecycleBin, UICancelOption.DoNothing);
                                    }
                                }
                            }
                        }
                    }
                }
            }
            catch (Exception)
            {
                MessageBox.Show("Hiba a fájl/könyvtár törlése során.");
            }
        }

		/// <summary>
		/// Segédmetódus a szerver válaszának beolvasására a felesleges whitespace karakterek eltávolításával, UTF8 kódolás használatával
		/// </summary>
		/// <returns></returns>
        private string read()
        {
            return deleterSettings.Ssh.Expect(deleterSettings.Pattern).Trim();
        }
    }
}
