using System.IO;
using System.Windows;
using iBrain.Models;
using iBrain.ViewModels;
using iBrain.Views.Controls;
using JetBrains.Annotations;
using Livia.Models;
using Livia.Models.Data;
using Livia.Properties;
using Livia.Utility.DependencyInjection;
using Livia.ViewModels;
using Livia.Views;
using Livia.Views.Utility;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Velopack;
namespace iBrain;
///
/// Interaction logic for App.xaml
///
public partial class App
{
private readonly ILogger _logger;
private readonly IServiceProvider _serviceProvider;
private readonly IWarningSystem _warningSystem;
private readonly IProcessManager _processManager;
private readonly ISerialKeyManager _serialKeyManager;
[UsedImplicitly] private Mutex? _mutex;
public App()
{
ServiceConfigurations.AppName = "ibrain";
VelopackApp.Build().Run();
ServiceProviderFactory.Init(sc =>
{
sc.AddSingleton();
sc.AddSingleton();
sc.AddSingleton();
});
InitializeComponent();
_serviceProvider = ServiceProviderFactory.ServiceProvider;
_logger = ActivatorUtilities.GetServiceOrCreateInstance>(ServiceProviderFactory.ServiceProvider);
_warningSystem = ActivatorUtilities.GetServiceOrCreateInstance(ServiceProviderFactory.ServiceProvider);
_serialKeyManager = ActivatorUtilities.GetServiceOrCreateInstance(ServiceProviderFactory.ServiceProvider);
_processManager = ActivatorUtilities.GetServiceOrCreateInstance(ServiceProviderFactory.ServiceProvider);
_logger.LogInformation("App Starting");
SettingsLogger.Init();
AppHelper helper = ActivatorUtilities.GetServiceOrCreateInstance(ServiceProviderFactory.ServiceProvider);
Dispatcher.UnhandledException += helper.OnDispatcherUnhandledException;
helper.UpdateSettings();
helper.LoadStrings();
}
private void OnStartup(object sender, StartupEventArgs eventArgs)
{
_mutex = new Mutex(true, "Livia", out bool isNewInstance);
if (!isNewInstance)
{
_warningSystem.ShowDialog(WarningWindowKind.Warning, true, "InstanceIsRunningError");
Current.Shutdown();
}
Settings.Default.ShowSelectReportModuleDialog = false;
Settings.Default.ShowSortedDownloadButton = false;
MainWindowViewModel.ShowRemainingQuota = false;
MainWindowViewModel.ShowCheckReportsButton = false;
MainWindowViewModel.ShowExportReportButton = false;
SettingsWindowViewModel.ShowExportReportSettings = false;
LoginControlViewModel.ShowMessage2 = false;
LoginControlViewModel.ShowMessage3 = false;
Settings.Default.ServerAddress = "127.0.0.1";
Settings.Default.ServerPort = 30489;
if (File.Exists(Path.Join(Directory.GetCurrentDirectory(), "iBrain_cmd", "main", "main.exe")))
{
bool success = _processManager.Start([
new ServerFileLocation("main.exe", Path.Join(Directory.GetCurrentDirectory(), "iBrain_cmd", "main")),
new ServerFileLocation("data-storage.exe", Path.Join(Directory.GetCurrentDirectory(), "iBrain_cmd", "data_storage"))
]);
if (!success)
{
_warningSystem.ShowDialog(WarningWindowKind.Error, true, "SystemCrashing");
_logger.LogError("Cannot start process");
Current.Shutdown();
return;
}
}
MainWindow mainWindow = ActivatorUtilities.CreateInstance(_serviceProvider);
mainWindow.AddMainControl(new BuptIBrainControl(ActivatorUtilities.GetServiceOrCreateInstance(ServiceProviderFactory.ServiceProvider)));
MainWindow = mainWindow;
if (!_serialKeyManager.Validate())
{
ValidateSerialKeyDialog dialog = new();
bool result = dialog.ShowDialog() ?? false;
if (!result)
{
_logger.LogWarning("ValidateSerialKeyDialog closed without success, shutting down");
Current.Shutdown();
}
}
mainWindow.Show();
_logger.LogInformation("App Started");
}
}