You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

228 lines
7.6 KiB

using System.Threading.Tasks;
using Model;
using System.Windows.Input;
using CommunityToolkit.Mvvm.ComponentModel;
using System.Collections.ObjectModel;
using CommunityToolkit.Mvvm.Input;
using System.Data.SqlTypes;
using System.Reflection;
namespace ViewModels;
public partial class ChampionsMgrVM : ObservableObject
{
internal IDataManager DataMgr { get; set; }
public ChampionsMgrVM(IDataManager dataManager)
{
DataMgr = dataManager;
loadingMethods = new Dictionary<LoadingCriterium, Func<object, Task>>()
{
[LoadingCriterium.None] = async (o) => await LoadChampions(),
[LoadingCriterium.ByName] = async (o) =>
{
string substring = o as string;
if(substring == null) return;
await LoadChampionsByName(substring);
},
[LoadingCriterium.BySkill] = async (o) =>
{
string skillString = o as string;
if(skillString == null) return;
await LoadChampionsBySkill(skillString);
},
[LoadingCriterium.ByCharacteristic] = async (o) =>
{
string characString = o as string;
if(characString == null) return;
await LoadChampionsByCharacteristic(characString);
},
[LoadingCriterium.ByClass] = async (o) =>
{
if(!Enum.IsDefined(typeof(ChampionClass), o)) return;
ChampionClass champClass = (ChampionClass)o;
await LoadChampionsByClass(champClass);
},
};
}
private async Task LoadChampionsFunc(Func<Task<IEnumerable<Champion?>>> loader,
Func<Task<int>> nbReader,
LoadingCriterium criterium,
object parameter = null)
{
Champions.Clear();
var someChampions = (await loader()).Select(c => new ChampionVM(c)).ToList();
foreach (var cvm in someChampions)
{
Champions.Add(cvm);
}
NbChampions = await nbReader();
currentLoadingCriterium = criterium;
currentLoadingParameter = parameter;
}
[RelayCommand]
public async Task LoadChampions()
{
await LoadChampionsFunc(async () => await DataMgr.ChampionsMgr.GetItems(index, count, "Name"),
async () => await DataMgr.ChampionsMgr.GetNbItems(),
LoadingCriterium.None);
}
[RelayCommand(CanExecute =nameof(CanLoadChampionsByName))]
public async Task LoadChampionsByName(string substring)
{
await LoadChampionsFunc(async () => await DataMgr.ChampionsMgr.GetItemsByName(substring, index, count, "Name"),
async () => await DataMgr.ChampionsMgr.GetNbItemsByName(substring),
LoadingCriterium.ByName,
substring);
}
private bool CanLoadChampionsByName(string substring)
=> !string.IsNullOrWhiteSpace(substring);
[RelayCommand(CanExecute =nameof(CanLoadChampionsBySkill))]
public async Task LoadChampionsBySkill(string skill)
{
await LoadChampionsFunc(
async () => await DataMgr.ChampionsMgr.GetItemsBySkill(skill, index, count, "Name"),
async () => await DataMgr.ChampionsMgr.GetNbItemsBySkill(skill),
LoadingCriterium.BySkill,
skill);
}
private bool CanLoadChampionsBySkill(string substring) => !string.IsNullOrWhiteSpace(substring);
[RelayCommand(CanExecute = nameof(CanLoadChampionsByCharacteristic))]
public async Task LoadChampionsByCharacteristic(string characteristic)
{
await LoadChampionsFunc(
async () => await DataMgr.ChampionsMgr.GetItemsByCharacteristic(characteristic, index, count, "Name"),
async () => await DataMgr.ChampionsMgr.GetNbItemsByCharacteristic(characteristic),
LoadingCriterium.ByCharacteristic,
characteristic);
}
private bool CanLoadChampionsByCharacteristic(string characteristic)
=> !string.IsNullOrWhiteSpace(characteristic);
[RelayCommand]
public async Task LoadChampionsByClass(ChampionClass champClass)
{
if(champClass == ChampionClass.Unknown)
{
return;
}
await LoadChampionsFunc(
async () => await DataMgr.ChampionsMgr.GetItemsByClass(champClass, index, count, "Name"),
async () => await DataMgr.ChampionsMgr.GetNbItemsByClass(champClass),
LoadingCriterium.ByClass,
champClass);
}
[RelayCommand(CanExecute =nameof(CanDeleteChampion))]
public async Task<bool> DeleteChampion(object champVM)
{
ChampionVM cvm = champVM as ChampionVM;
if(cvm == null || !Champions.Contains(cvm)) return false;
bool result = await DataMgr.ChampionsMgr.DeleteItem(cvm.Model);
if(result)
{
Champions.Remove(cvm);
await LoadChampions();
}
return result;
}
bool CanDeleteChampion(object cvm)
=> cvm!= null && cvm is ChampionVM && Champions.Contains(cvm);
[ObservableProperty]
[NotifyCanExecuteChangedFor(nameof(NextPageCommand))]
[NotifyCanExecuteChangedFor(nameof(PreviousPageCommand))]
private int index = 0;
[ObservableProperty]
[NotifyPropertyChangedFor(nameof(NbPages))]
[NotifyCanExecuteChangedFor(nameof(NextPageCommand))]
[NotifyCanExecuteChangedFor(nameof(PreviousPageCommand))]
private int count = 5;
public int NbPages
{
get
{
if(Count == 0 || NbChampions == 0)
{
return 0;
}
return (NbChampions-1) / Count + 1;
}
}
[ObservableProperty]
[NotifyPropertyChangedFor(nameof(NbPages))]
[NotifyCanExecuteChangedFor(nameof(NextPageCommand))]
[NotifyCanExecuteChangedFor(nameof(PreviousPageCommand))]
private int nbChampions = 0;
[ObservableProperty]
private ObservableCollection<ChampionVM> champions = new ObservableCollection<ChampionVM>();
[RelayCommand(CanExecute =nameof(CanPreviousPage))]
async Task PreviousPage()
{
if(Index > 0)
{
Index--;
await loadingMethods[currentLoadingCriterium](currentLoadingParameter);
}
}
bool CanPreviousPage() => Index > 0;
[RelayCommand(CanExecute =nameof(CanNextPage))]
async Task NextPage()
{
if(Index < NbPages-1)
{
Index++;
await loadingMethods[currentLoadingCriterium](currentLoadingParameter);
}
}
bool CanNextPage() => Index < NbPages-1;
enum LoadingCriterium
{
None,
ByName,
BySkill,
ByCharacteristic,
ByClass
}
private LoadingCriterium currentLoadingCriterium = LoadingCriterium.None;
private object currentLoadingParameter = null;
private Dictionary<LoadingCriterium, Func<object, Task>> loadingMethods;
public async Task AddChampion(ChampionVM champVM)
{
var added = await DataMgr.ChampionsMgr.AddItem(champVM.Model);
if(added != null)
{
Champions.Add(champVM);
await LoadChampions();
}
}
public async Task EditChampion(ChampionVM oldChampion, ChampionVM newChampion)
{
var edited = await DataMgr.ChampionsMgr.UpdateItem(oldChampion.Model, newChampion.Model);
oldChampion.Model = newChampion.Model;
if(edited != null)
{
await LoadChampions();
}
}
}