using LANCommander.Launcher.Data; using LANCommander.Launcher.Data.Models; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Logging; namespace LANCommander.Launcher.Services { public class ToolService( ILogger logger, DatabaseContext dbContext) : BaseDatabaseService(dbContext, logger) { /// /// Returns the install-state join rows for every tool currently installed for the given game. /// The related is eagerly loaded. /// public async Task> GetInstalledToolsForGameAsync(Guid gameId) { return await Context.Set() .Include(gt => gt.Tool) .Where(gt => gt.GameId == gameId && gt.Installed) .ToListAsync(); } /// /// Returns the install-state join rows for every game the given tool is installed for. /// public async Task> GetInstalledGameToolsAsync(Guid toolId) { return await Context.Set() .Where(gt => gt.ToolId == toolId && gt.Installed) .ToListAsync(); } public async Task IsToolInstalledForGameAsync(Guid gameId, Guid toolId) { return await Context.Set() .AnyAsync(gt => gt.GameId == gameId && gt.ToolId == toolId && gt.Installed); } /// /// Records that a tool has been installed for a specific game. Creates the join row if the /// game/tool association does not yet exist locally. /// public async Task SetToolInstalledAsync(Guid gameId, Guid toolId, string installDirectory, string version) { var gameTool = await Context.Set() .FirstOrDefaultAsync(gt => gt.GameId == gameId && gt.ToolId == toolId); if (gameTool == null) { gameTool = new GameTool { GameId = gameId, ToolId = toolId }; await Context.Set().AddAsync(gameTool); } gameTool.Installed = true; gameTool.InstallDirectory = installDirectory; gameTool.InstalledVersion = version; gameTool.InstalledOn ??= DateTime.Now; await Context.SaveChangesAsync(); } /// /// Clears the install state for a tool on a specific game without removing the game/tool /// association. Other games keep their own install state. /// public async Task SetToolUninstalledAsync(Guid gameId, Guid toolId) { var gameTool = await Context.Set() .FirstOrDefaultAsync(gt => gt.GameId == gameId && gt.ToolId == toolId); if (gameTool == null) return; gameTool.Installed = false; gameTool.InstallDirectory = null; gameTool.InstalledVersion = null; gameTool.InstalledOn = null; await Context.SaveChangesAsync(); } } }