using GsConfigTool.Helpers;
using GsConfigTool.Models;
using GsConfigTool.Services;
using System.Collections.ObjectModel;
using System.Windows.Input;
namespace GsConfigTool.ViewModels;
public class MainViewModel : BaseViewModel
{
private readonly DatabaseService _db;
private BaseViewModel? _currentPage;
private string _currentPageName = "Home";
private ServerProject? _activeProject;
public MainViewModel()
{
_db = new DatabaseService();
_ = InitAsync();
NavigateHomeCommand = new RelayCommand(() => NavigateTo("Home"));
NavigateProjectsCommand = new RelayCommand(() => NavigateTo("Projects"));
OpenProjectCommand = new RelayCommand<ServerProject>(OpenProject);
NewArkSECommand = new RelayCommand(() => NavigateTo("ArkSE"));
NewArkSACommand = new RelayCommand(() => NavigateTo("ArkSA"));
NewPalworldCommand = new RelayCommand(() => NavigateTo("Palworld"));
}
public BaseViewModel? CurrentPage
{
get => _currentPage;
set => SetField(ref _currentPage, value);
}
public string CurrentPageName
{
get => _currentPageName;
set => SetField(ref _currentPageName, value);
}
public ServerProject? ActiveProject
{
get => _activeProject;
set => SetField(ref _activeProject, value);
}
public ICommand NavigateHomeCommand { get; }
public ICommand NavigateProjectsCommand { get; }
public ICommand OpenProjectCommand { get; }
public ICommand NewArkSECommand { get; }
public ICommand NewArkSACommand { get; }
public ICommand NewPalworldCommand { get; }
private async Task InitAsync()
{
await _db.InitializeAsync();
NavigateTo("Home");
}
public void NavigateTo(string page, object? parameter = null)
{
CurrentPageName = page;
CurrentPage = page switch
{
"Home" => new HomeViewModel(this),
"Projects" => new ProjectsViewModel(_db, this),
"ArkSE" => new ArkConfigViewModel(_db, this, GameType.ArkSurvivalEvolved, parameter as ServerProject),
"ArkSA" => new ArkConfigViewModel(_db, this, GameType.ArkSurvivalAscended, parameter as ServerProject),
"Palworld" => new PalworldConfigViewModel(_db, this, parameter as ServerProject),
_ => new HomeViewModel(this)
};
}
public void OpenProject(ServerProject? project)
{
if (project == null) return;
ActiveProject = project;
NavigateTo(project.Game switch
{
GameType.ArkSurvivalEvolved => "ArkSE",
GameType.ArkSurvivalAscended => "ArkSA",
GameType.Palworld => "Palworld",
_ => "Home"
}, project);
}
}
public class RelayCommand<T> : ICommand
{
private readonly Action<T?> _execute;
private readonly Func<T?, bool>? _canExecute;
public RelayCommand(Action<T?> execute, Func<T?, bool>? canExecute = null)
{
_execute = execute;
_canExecute = canExecute;
}
public event EventHandler? CanExecuteChanged
{
add => System.Windows.Input.CommandManager.RequerySuggested += value;
remove => System.Windows.Input.CommandManager.RequerySuggested -= value;
}
public bool CanExecute(object? parameter) => _canExecute?.Invoke((T?)parameter) ?? true;
public void Execute(object? parameter) => _execute((T?)parameter);
}