using System;
using System.Threading;
using System.Threading.Tasks;
using RudderSdk.Core.Models.BattlePass;
namespace RudderSdk.Core;
///
/// Battle pass progress and rewards. The simple overloads target the project's
/// default battle pass; the request-based overloads carry the scenario node
/// context and are used by the scenario runtime.
///
public sealed class BattlePassService
{
/// Free reward track, see .
public const string TrackFree = "free";
/// Premium reward track, see .
public const string TrackPremium = "premium";
private readonly RudderClient _client;
internal BattlePassService(RudderClient client) => _client = client;
/// Reads current progress: xp, level, premium ownership, claimed tiers.
public Task GetProgressAsync(CancellationToken cancellationToken = default)
=> GetProgressAsync(new GetBattlePassProgressRequest(), cancellationToken);
/// Credits xp and returns the new xp/level and level-up flags.
public Task AddXpAsync(long amount, CancellationToken cancellationToken = default)
=> AddXpAsync(new AddBattlePassXpRequest { Amount = amount }, cancellationToken);
///
/// Claims a tier reward at a reached level (idempotent server-side).
/// is or .
///
public Task ClaimRewardAsync(int level, string track, CancellationToken cancellationToken = default)
=> ClaimRewardAsync(new ClaimBattlePassRewardRequest { Level = level, Track = track }, cancellationToken);
///
/// Purchases the premium track (charges the wallet). When
/// is null, a random one is generated.
///
public Task PurchasePremiumAsync(string? idempotencyKey = null, CancellationToken cancellationToken = default)
=> PurchasePremiumAsync(new PurchaseBattlePassPremiumRequest
{
IdempotencyKey = idempotencyKey ?? Guid.NewGuid().ToString()
}, cancellationToken);
internal Task GetProgressAsync(GetBattlePassProgressRequest request, CancellationToken cancellationToken = default)
=> _client.SendAsync(
"POST",
"/sdk/v1/battlepass/progress",
request,
cancellationToken);
internal Task AddXpAsync(AddBattlePassXpRequest request, CancellationToken cancellationToken = default)
=> _client.SendAsync(
"POST",
"/sdk/v1/battlepass/xp",
request,
cancellationToken);
internal Task ClaimRewardAsync(ClaimBattlePassRewardRequest request, CancellationToken cancellationToken = default)
=> _client.SendAsync(
"POST",
"/sdk/v1/battlepass/claim",
request,
cancellationToken);
internal Task PurchasePremiumAsync(PurchaseBattlePassPremiumRequest request, CancellationToken cancellationToken = default)
=> _client.SendAsync(
"POST",
"/sdk/v1/battlepass/premium",
request,
cancellationToken);
}