using System;
using System.IO;
using System.Threading;
using System.Windows.Forms;
using System.Linq;
using System.Text;

namespace GFATask
{
    static class Program
    {
        /// <summary>
        /// Der Haupteinstiegspunkt für die Anwendung.
        /// </summary>
        [STAThread]
        static void Main()
        {
            using (Mutex mutexSingleInstance = new Mutex(true, "bea96733-dfdb-4e00-9cd9-c3e9b1e1d031"))
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                if (Environment.CommandLine.Contains("-restart") || mutexSingleInstance.WaitOne(TimeSpan.Zero, true) && (Environment.GetEnvironmentVariable("RUN_GFATASK", EnvironmentVariableTarget.Machine) == null || Environment.GetEnvironmentVariable("RUN_GFATASK", EnvironmentVariableTarget.Machine) == "1"))
                {
                    
                    // Prüft ob die Datei user.json vorhanden ist. Wenn nicht, wird sie automatisch erstellt. Falls doch und nur nötige Eigenschaften fehlen, werden diese angefügt.
                    Deploy.Templating(
                        typeof(Models.Config.User),
                        Paths.UserConfig.FullName,
                        File.Exists(Paths.UserConfig.FullName) ? JSON.Exists(Paths.UserConfig.FullName, "deploy") ? Config.User.Deploy.Overwrite : true : true,
                        File.Exists(Paths.UserConfig.FullName) ? JSON.Exists(Paths.UserConfig.FullName, "deploy") ? Config.User.Deploy.Backup : true : true);

                    // Prüft ob die Prevalence/Favoriten-Datei im benutzerdefinierten Verzeichnis vorhanden ist. Wenn nicht wird sie automatisch erstellt. Wenn doch, wird geprüft,
                    // ob die user.json Datei bereits existiert. Falls ja, wird nach der Eigenschaft Overwrite verfahren, andernfalls wird sie ebenfalls automatisch erstellt
                    Deploy.AppListTemplate(DeployAppList.Prevalence, File.Exists(Paths.Prevalence.FullName) ? Config.User.Deploy.Overwrite : true, File.Exists(Paths.Prevalence.FullName) ? Config.User.Deploy.Backup : false);
                    Deploy.AppListTemplate(DeployAppList.Favorites, File.Exists(Paths.Favorites.Apps.FullName) ? Config.User.Deploy.Overwrite : true, File.Exists(Paths.Favorites.Apps.FullName) ? Config.User.Deploy.Backup : false);


                    // Prüft die Eigenschaften-Strukturen der angegebenen json-Dateien
                    if (Models.Compare.StructureUserConfig(Paths.UserConfig.FullName).Any())
                        JSON.Save(JSONConfig.User);
                    if(Models.Compare.Structure<Models.AppList<Models.App>>(Paths.Favorites.Apps.FullName).Any())
                        JSON.Save(JSONApp.Favorites);
                    if (Models.Compare.Structure<Models.Prevalence>(Paths.Prevalence.FullName).Any())
                        JSON.Save(JSONConfig.Prevalence);

                    try
                    {
                        Forms.Main = new FormMain();
                        XObjects.SystemChanges.Load();
                        Application.Run(Forms.Main);
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.ToString());
                    }
                }
                else
                {

                }
            }
        }
    }
}
