using System.Text.Json.Serialization;
namespace NeonSprawl.Server.Game.Quests;
/// JSON body for GET /game/players/{{id}}/quest-progress (NEO-119).
public sealed class QuestProgressListResponse
{
public const int CurrentSchemaVersion = 1;
[JsonPropertyName("schemaVersion")]
public int SchemaVersion { get; init; } = CurrentSchemaVersion;
[JsonPropertyName("playerId")]
public required string PlayerId { get; init; }
/// Per-player rows ordered by catalog quest id (ordinal).
[JsonPropertyName("quests")]
public required IReadOnlyList Quests { get; init; }
}
/// Authoritative per-player progress for one quest definition.
public sealed class QuestProgressRowJson
{
[JsonPropertyName("questId")]
public required string QuestId { get; init; }
/// not_started, active, or completed.
[JsonPropertyName("status")]
public required string Status { get; init; }
[JsonPropertyName("currentStepIndex")]
public int CurrentStepIndex { get; init; }
/// Objective id → accumulated count for the current step only.
[JsonPropertyName("objectiveCounters")]
public required IReadOnlyDictionary ObjectiveCounters { get; init; }
[JsonPropertyName("completedAt")]
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
public DateTimeOffset? CompletedAt { get; init; }
/// Grant snapshot when is completed and delivery was recorded (NEO-129).
[JsonPropertyName("completionRewardSummary")]
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
public QuestCompletionRewardSummaryJson? CompletionRewardSummary { get; init; }
}
/// Item, skill XP, and reputation grants applied on first-time quest completion (NEO-129, NEO-140).
public sealed class QuestCompletionRewardSummaryJson
{
[JsonPropertyName("itemGrants")]
public required IReadOnlyList ItemGrants { get; init; }
[JsonPropertyName("skillXpGrants")]
public required IReadOnlyList SkillXpGrants { get; init; }
[JsonPropertyName("reputationGrants")]
public required IReadOnlyList ReputationGrants { get; init; }
}
/// One item grant line in .
public sealed class QuestItemGrantJson
{
[JsonPropertyName("itemId")]
public required string ItemId { get; init; }
[JsonPropertyName("quantity")]
public required int Quantity { get; init; }
}
/// One skill XP grant line in .
public sealed class QuestSkillXpGrantJson
{
[JsonPropertyName("skillId")]
public required string SkillId { get; init; }
[JsonPropertyName("amount")]
public required int Amount { get; init; }
}
/// One reputation grant line in (NEO-140).
public sealed class QuestReputationGrantJson
{
[JsonPropertyName("factionId")]
public required string FactionId { get; init; }
[JsonPropertyName("amount")]
public required int Amount { get; init; }
}