using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Vanguard.Api;
using Vanguard.Api.Contracts;
using Vanguard.State;
namespace Vanguard.Meta
{
/// Обёртка над мета-эндпоинтами: магазин, коллекция, колоды.
public sealed class MetaService
{
private readonly ApiClient _api;
private readonly PlayerState _player;
public MetaService(ApiClient api, PlayerState player)
{
_api = api;
_player = player;
}
public async Task GetStoreAsync()
{
var store = await _api.GetAsync("/api/store");
_player.ApplyBalances(store.Balances);
return store;
}
public async Task OnboardAsync(string deckId)
{
var response = await _api.PostAsync(
"/api/meta/onboarding",
new OnboardingRequest { DeckId = deckId });
_player.ApplyBalances(response.Balances);
_player.MarkOnboarded(response.DeckId);
return response;
}
public async Task GetCollectionAsync()
{
var collection = await _api.GetAsync("/api/collection");
_player.ApplyBalances(collection.Balances);
return collection;
}
public async Task DismantleAsync(string printingId, int count)
{
var balances = await _api.PostAsync(
"/api/collection/dismantle",
new DismantleRequest
{
PrintingId = printingId,
Count = count,
IdempotencyKey = Guid.NewGuid().ToString("N"),
});
_player.ApplyBalances(balances);
return balances;
}
public async Task> GetDecksAsync()
{
var decks = await _api.GetAsync>("/api/decks");
return decks ?? new List();
}
public async Task CreateDeckAsync(string name, List cards) =>
await _api.PostAsync(
"/api/decks",
new DeckRequest { Name = name, Cards = cards });
public Task DeleteDeckAsync(Guid deckId) =>
_api.DeleteAsync("/api/decks/" + deckId.ToString("D"));
public async Task ValidateDeckAsync(Guid deckId, List cards) =>
await _api.PostAsync(
"/api/decks/" + deckId.ToString("D") + "/validate",
new DeckRequest { Cards = cards });
}
}