using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; using SVSim.Database; using SVSim.EmulatedEntrypoint.Models.Dtos.Requests.LeaderSkin; using SVSim.EmulatedEntrypoint.Models.Dtos.Responses.LeaderSkin; namespace SVSim.EmulatedEntrypoint.Controllers; /// /// /leader_skin/* — per-class "active leader skin" preference. The per-CLASS setting is the /// fallback used when a deck has leader_skin_id == 0; per-deck overrides go through /// /deck/update_leader_skin instead. /// [Route("leader_skin")] public class LeaderSkinController : SVSimController { private readonly SVSimDbContext _db; public LeaderSkinController(SVSimDbContext db) { _db = db; } [HttpPost("set")] public async Task> Set(LeaderSkinSetRequest request) { if (!TryGetViewerId(out long viewerId)) return Unauthorized(); if (request.IsRandomLeaderSkin) { // Random-skin mode needs a per-viewer per-class shuffle pool, which we don't // persist yet (ViewerClassData has no list field for it). Punt for now. return StatusCode(StatusCodes.Status501NotImplemented, new { error = "random_leader_skin_not_implemented" }); } var viewer = await _db.Viewers .Include(v => v.Classes).ThenInclude(c => c.Class) .Include(v => v.Classes).ThenInclude(c => c.LeaderSkin) .Include(v => v.LeaderSkins) .FirstOrDefaultAsync(v => v.Id == viewerId); if (viewer is null) return Unauthorized(); var classData = viewer.Classes.FirstOrDefault(c => c.Class.Id == request.ClassId); if (classData is null) return BadRequest(new { error = "unknown_class" }); // Skin must (a) exist in the catalog, (b) match the target class, (c) be owned by the viewer. var skin = await _db.LeaderSkins.FindAsync(request.LeaderSkinId); if (skin is null) return BadRequest(new { error = "unknown_skin" }); if (skin.ClassId != request.ClassId) return BadRequest(new { error = "skin_class_mismatch" }); if (viewer.LeaderSkins.All(s => s.Id != skin.Id)) return BadRequest(new { error = "skin_not_owned" }); classData.LeaderSkin = skin; await _db.SaveChangesAsync(); return new LeaderSkinSetResponse { IsRandomLeaderSkin = false, LeaderSkinId = skin.Id, LeaderSkinIdList = new(), }; } }