using System.Text.Json.Serialization;
namespace NeonSprawl.Server.Game.Crafting;
/// POST body for POST /game/players/{{id}}/craft (NEO-70).
public sealed class PlayerCraftRequest
{
public const int CurrentSchemaVersion = 1;
[JsonPropertyName("schemaVersion")]
public int SchemaVersion { get; init; }
[JsonPropertyName("recipeId")]
public required string RecipeId { get; init; }
/// Optional batch count; defaults to 1 when omitted.
[JsonPropertyName("quantity")]
public int? Quantity { get; init; }
}
/// POST response — promoted wire shape (NEO-70).
public sealed class CraftResponse
{
public const int CurrentSchemaVersion = 1;
[JsonPropertyName("schemaVersion")]
public int SchemaVersion { get; init; } = CurrentSchemaVersion;
[JsonPropertyName("success")]
public bool Success { get; init; }
[JsonPropertyName("reasonCode")]
public string? ReasonCode { get; init; }
[JsonPropertyName("inputsConsumed")]
public required IReadOnlyList InputsConsumed { get; init; }
[JsonPropertyName("outputsGranted")]
public required IReadOnlyList OutputsGranted { get; init; }
[JsonPropertyName("xpGrantSummary")]
public CraftXpGrantSummaryJson? XpGrantSummary { get; init; }
}
/// One scaled input consumed or output granted on successful craft.
public sealed class CraftIoAppliedJson
{
[JsonPropertyName("itemId")]
public required string ItemId { get; init; }
[JsonPropertyName("quantity")]
public int Quantity { get; init; }
}
/// Refine skill XP applied on successful craft.
public sealed class CraftXpGrantSummaryJson
{
[JsonPropertyName("skillId")]
public required string SkillId { get; init; }
[JsonPropertyName("amount")]
public int Amount { get; init; }
[JsonPropertyName("sourceKind")]
public required string SourceKind { get; init; }
}