using DTO; using Model; using System.Net.Http.Json; using ApiMapping; using System; using System.Data.SqlTypes; using Microsoft.EntityFrameworkCore.Metadata.Internal; namespace ApiManager { public partial class ApiManagerData { public class RunesManager : HttpClientManager, IRunesManager { private const string UrlApiRunes = "/api/runes"; public RunesManager(HttpClient httpClient) : base(httpClient) { } public async Task AddItem(Rune? item) { try { var resp = await _httpClient.PostAsJsonAsync($"{UrlApiRunes}", item.ToDto()); if (resp.IsSuccessStatusCode) { var createdItem = await resp.Content.ReadFromJsonAsync(); return createdItem?.ToModel(); } else { return null; } } catch (Exception ex) { Console.WriteLine($"Error adding rune: {ex.Message}"); return null; } } public async Task DeleteItem(Rune? item) { try { var resp = await _httpClient.DeleteAsync($"{UrlApiRunes}/{item?.Name}"); return resp.IsSuccessStatusCode; } catch (Exception ex) { Console.WriteLine($"Error deleting rune: {ex.Message}"); return false; } } private static Func filterByRuneFamily = (rune, family) => rune.Family == family; private static Func filterByName = (rune, substring) => rune.Name.Equals(substring, StringComparison.InvariantCultureIgnoreCase); private static Func filterByNameContains = (rune, substring) => rune.Name.Contains(substring, StringComparison.InvariantCultureIgnoreCase); public async Task> GetItemByName(string substring, int index, int count, string? orderingPropertyName = null, bool descending = false) { var runes = await _httpClient.GetFromJsonAsync>(UrlApiRunes); return runes.Data.Select(r => r.ToModel()).GetItemsWithFilterAndOrdering( rune => filterByName(rune, substring), index, count, orderingPropertyName, descending); } public async Task> GetItems(int index, int count, string? orderingPropertyName = null, bool descending = false) { var runes = await _httpClient.GetFromJsonAsync>($"{UrlApiRunes}?&index={index}&count={count}&descending={descending}"); return runes.Data.Select(c => c.ToModel()); } public async Task> GetItemsByFamily(RuneFamily family, int index, int count, string? orderingPropertyName = null, bool descending = false) { var runes = await _httpClient.GetFromJsonAsync>(UrlApiRunes); return runes.Data.Select(r => r.ToModel()).GetItemsWithFilterAndOrdering( rune => filterByRuneFamily(rune, family), index, count, orderingPropertyName, descending); } public async Task> GetItemsByName(string substring, int index, int count, string? orderingPropertyName = null, bool descending = false) { var runes = await _httpClient.GetFromJsonAsync>(UrlApiRunes); return runes.Data.Select(r => r.ToModel()).GetItemsWithFilterAndOrdering( rune => filterByNameContains(rune, substring), index, count, orderingPropertyName, descending); } public async Task GetNbItems() { var response = await _httpClient.GetAsync("/countRunes"); var content = await response.Content.ReadAsStringAsync(); return int.Parse(content); } public async Task GetNbItemsByFamily(RuneFamily family) { var runes = await _httpClient.GetFromJsonAsync>(UrlApiRunes); return await runes.Data.Select(r => r.ToModel()).GetNbItemsWithFilter( rune => filterByRuneFamily(rune, family)); } public async Task GetNbItemsByName(string substring) { var runes = await _httpClient.GetFromJsonAsync>(UrlApiRunes); return await runes.Data.Select(r => r.ToModel()).GetNbItemsWithFilter( rune => filterByName(rune, substring)); } public async Task UpdateItem(Rune? oldItem, Rune? newItem) { try { var resp = await _httpClient.PutAsJsonAsync($"{UrlApiRunes}/{oldItem?.Name}", newItem.ToDto()); if (resp.IsSuccessStatusCode) { var updatedItem = await resp.Content.ReadFromJsonAsync(); return updatedItem?.ToModel(); } else { return null; } } catch (Exception ex) { Console.WriteLine($"Error updating rune: {ex.Message}"); return null; } } } } }