namespace SVSim.EmulatedEntrypoint.Services; public interface ICardAcquisitionService { /// /// Grant cards + associated cosmetics in one transaction. /// /// • non-null → increments OwnedCardEntry for each via /// the existing IPackRepository.GrantCardsToViewer primitive, then grants any /// cosmetics associated with those cards that the viewer doesn't yet own. /// • null → backfill mode: skips card mutation, /// scans viewer.Cards, grants missing cosmetics. /// /// Returns wire-shape RewardList in both modes. Backfill callers typically discard. /// All ownership writes happen in a single SaveChangesAsync. /// Task GrantAsync(long viewerId, IEnumerable? newCardIds = null); }