using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace GFATask
{
    /// <summary>
    /// Beinhaltet das Sichern und Laden von benutzerdefinierten Dateien
    /// </summary>
    class ConfigBackupClass
    {
        /// <summary>
        /// Erstellt eine Sicherung der benutzerdefinierten Einstellungen, App-Beliebtheit und Favoriten
        /// </summary>
        public static void Save()
        {
            Deploy.Templating(typeof(Models.Config.User), Paths.UserConfig.FullName, false, true);
            Deploy.AppListTemplate(DeployAppList.Prevalence, false, true);
            Deploy.AppListTemplate(DeployAppList.Favorites, false, true);
            XObjects.MessageBox("Sicherung der Konfigurationsdateien (Benutzereinstellungen, App-Beliebtheit und Favoriten) erfolgreich", NotifyButtons.OK, NotifyType.Message, new Size(300, 140), "Erfolgreiche Sicherung");
        }

        /// <summary>
        /// Lädt eine Sicherung der benutzerdefinierten Einstellungen, App-Beliebtheit und/oder Favoriten
        /// </summary>
        public static void Load()
        {
            DataTable backuptable = new DataTable("Backups");
            backuptable.Columns.Add("Wiederherstellen", typeof(bool));
            backuptable.Columns.Add(new DataColumn("Wiederherstellungstyp", typeof(string)));
            backuptable.Columns.Add("Datum", typeof(DateTime));
            backuptable.Columns.Add("Sicherungssatz", typeof(string));

            foreach (string file in Directory.GetFiles(Paths.Bak.Directory, $"{Environment.UserName.ToLower()}_*"))
            {
                ConfigBackup backup = new ConfigBackup(file);
                backuptable.Rows.Add(false, backup.RecoveryType.GetDescription(), backup.When, Path.GetFileName(backup.FileName));
            }
            if (backuptable.Rows.Count == 0)
                if (XObjects.MessageBox("Es sind keine Sicherungssätze vorhanden", NotifyButtons.OK, NotifyType.Message, new Size(300, 120), "Keine Sicherungen vorhanden").Result == DialogResult.OK)
                    return;
            backuptable = backuptable.Select("","Wiederherstellungstyp ASC, Datum DESC").CopyToDataTable();


            var msgbox = XObjects.MessageBox("", NotifyButtons.OkCancel, NotifyType.DataGrid, new Size(500, 350), "Sicherungen laden", Convert.ChangeType(backuptable, typeof(DataTable)));
            if (msgbox.Result == DialogResult.OK)
            {

                Dictionary<ConfigRecoveryType, List<ConfigBackup>> selected_recoveries = new Dictionary<ConfigRecoveryType, List<ConfigBackup>>();

                foreach (var recovery in backuptable.Rows.Cast<DataRow>().Where(row => (bool)row.ItemArray[0] == true))
                {
                    ConfigBackup selected = new ConfigBackup(recovery.ItemArray.Last().ToString());

                    if (!selected_recoveries.ContainsKey(selected.RecoveryType))
                        selected_recoveries.Add(selected.RecoveryType, new List<ConfigBackup>());
                    
                    selected_recoveries[selected.RecoveryType].Add(selected);
                    selected_recoveries[selected.RecoveryType].Sort();

                    if (selected_recoveries.ContainsKey(selected.RecoveryType) && selected_recoveries[selected.RecoveryType].Count > 1)
                    {
                        var msg = XObjects.MessageBox($"Es wurden mehrere {selected.RecoveryType.GetDescription()} zur Wiederherstellung ausgewählt.\n\n" +
                            $"Soll die Datei vom {selected_recoveries[selected.RecoveryType].Last().When}\n" +
                            $"Durch eine Ältere vom {selected.When} ersetzt werden", NotifyButtons.YesNoCancel, NotifyType.Message, new Size(350, 200), "Ersetzen");
                        if (msg.Result == DialogResult.Yes)
                        {
                            selected.Recover();
                        }
                        else if (msg.Result == DialogResult.No)
                            continue;
                        else if (msg.Result == DialogResult.Cancel)
                            break;
                    }
                    else
                    {
                        selected.Recover();
                    }
                }

            }
        }
    }
}
