using System.Text.Json; using DataModel; using DataModel.Database.Common; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Processor; using static UI_WinForms.Components.LoaderStart.LoaderAction; namespace UI_WinForms; internal static class Program { internal static IServiceProvider? SERVICE_PROVIDER; internal static bool RestartMainApp = false; [STAThread] private static void Main() { ApplicationConfiguration.Initialize(); Application.EnableVisualStyles(); // Start the loader screen: var loader = new Loader(); Application.Run(loader); // Check, if the user closes the loader screen: if (loader.DialogResult != DialogResult.OK) return; // // Create the DI system // var builder = new HostBuilder(); // // Add services // builder.ConfigureServices((hostContext, serviceCollection) => { if(loader.Result.Action is LOAD_PROJECT or CREATE_NEW_PROJECT) serviceCollection.AddDatabase(loader.Result.DataFile, true); else if(loader.Result.Action is IMPORT_JSON) { try { serviceCollection.ImportDataAndAddDatabase(loader.Result.DataFile).ConfigureAwait(false).GetAwaiter().GetResult(); } catch (JsonException e) { MessageBox.Show($"The JSON file '{loader.Result.DataFile}' is invalid and cannot be imported: {e.Message}", "Invalid JSON file", MessageBoxButtons.OK, MessageBoxIcon.Error); Environment.Exit(100); } catch(Exception e) { MessageBox.Show($"An error occurred while importing the JSON file '{loader.Result.DataFile}': {e.Message}", "Error while importing JSON file", MessageBoxButtons.OK, MessageBoxIcon.Error); Environment.Exit(101); } } }); // Get the host out of the DI system: using (var host = builder.Build()) { // Create a service scope: using (var scope = host.Services.CreateScope()) { // Get a service provider: SERVICE_PROVIDER = scope.ServiceProvider; // Set the service provider to the processor: ProcessorMeta.ServiceProvider = SERVICE_PROVIDER; // Apply database migrations: using (var database = SERVICE_PROVIDER.GetRequiredService()) Setup.PerformDataMigration(database).Wait(); // Start the app: do { Processor.DeepL.ResetState(); Application.Run(new Main()); } while (Program.RestartMainApp); } } // Tear down the setup: AppDomain.CurrentDomain.ProcessExit += (sender, eventArgs) => Setup.SETUP_MAINTENANCE.Dispose(); } }