namespace BlueLaminate.Core.Tradeups;
///
/// A skin that can come OUT of a tradeup, carrying the float bounds needed to map an
/// input average float onto this skin's own wear range.
/// is recorded so the listing-side query (Phase C) can filter ST vs non-ST outputs;
/// the graph itself is ST-agnostic.
///
public sealed record TradeupOutputSkin(
int SkinId,
string Name,
decimal FloatMin,
decimal FloatMax,
bool StatTrakAvailable);
///
/// One tradeup "recipe slot": all eligible input skins of a single rarity within one
/// collection, and the set of output skins they produce (the next rarity tier present
/// in that collection). For a single-collection contract, ten inputs are drawn from
/// and each of is an equally likely
/// outcome, so k_C = OutputSkins.Count.
///
public sealed record TradeupInputGroup(
int CollectionId,
string CollectionName,
WeaponRarity InputRarity,
WeaponRarity OutputRarity,
IReadOnlyList InputSkinIds,
IReadOnlyList OutputSkins);
///
/// The full tradeup reference graph derived from the static catalogue: every
/// (collection, input rarity) → (output rarity, output skins) edge that yields a
/// 10-input weapon tradeup. Built once per process from the monthly-synced catalogue
/// (see ); contains no pricing or listing data.
///
public sealed record TradeupGraph(IReadOnlyList Groups);