using Microsoft.AspNetCore.Mvc;
using SQLiteEF;
using static Microsoft.AspNetCore.Http.StatusCodes;

namespace API.Controllers;

[ApiController]
[Route("[controller]")]
public class ActionsController(Context databaseContext) : ApiController(typeof(ActionsController))
{
    [HttpPut("Player/{steamId}")]
    [ProducesResponseType<Player>(Status202Accepted)]
    [ProducesResponseType<string>(Status500InternalServerError)]
    public IActionResult AddPlayerToTrack(Tracker tracker, ulong steamId)
    {
        Player nPlayer = new (steamId, "", "", "");
        try
        {
            databaseContext.Players.Add(nPlayer);
            databaseContext.SaveChanges();
            tracker.ForceLoop();
            return Accepted(nPlayer);
        }
        catch (Exception e)
        {
            Log.Error(e);
            return StatusCode(Status500InternalServerError);
        }
    }

    [HttpDelete("Player/{steamId}")]
    [ProducesResponseType<Player>(Status202Accepted)]
    [ProducesResponseType<string>(Status500InternalServerError)]
    public IActionResult DeletePlayer(ulong steamId)
    {
        if (databaseContext.Players.Find(steamId) is not { } player)
            return NotFound();
        try
        {
            databaseContext.Players.Remove(player);
            databaseContext.SaveChanges();
            return Accepted();
        }
        catch (Exception e)
        {
            Log.Error(e);
            return StatusCode(Status500InternalServerError);
        }
    }

    [HttpPost("Update/Player/{steamId}/All")]
    [ProducesResponseType(Status200OK)]
    [ProducesResponseType(Status404NotFound)]
    public IActionResult UpdatePlayer(Tracker tracker, ulong steamId)
    {
        if (databaseContext.Players.Find(steamId) is not { } player)
            return NotFound();
        
        tracker.UpdatePlayer(databaseContext, player);
        tracker.UpdateOwnedGamesPlayer(databaseContext, player);
        tracker.UpdateGameTimesPlayer(databaseContext, player);
        return Ok();
    }
    
    [HttpPost("Update/Player/{steamId}/Info")]
    [ProducesResponseType(Status200OK)]
    [ProducesResponseType(Status404NotFound)]
    public IActionResult UpdatePlayerInfo(Tracker tracker, ulong steamId)
    {
        if (databaseContext.Players.Find(steamId) is not { } player)
            return NotFound();
        tracker.UpdatePlayer(databaseContext, player);
        return Ok();
    }
    
    [HttpPost("Update/Player/{steamId}/OwnedGames")]
    [ProducesResponseType(Status200OK)]
    [ProducesResponseType(Status404NotFound)]
    public IActionResult UpdatePlayerOwnedGames(Tracker tracker, ulong steamId)
    {
        if (databaseContext.Players.Find(steamId) is not { } player)
            return NotFound();
        tracker.UpdateOwnedGamesPlayer(databaseContext, player);
        return Ok();
    }
    
    [HttpPost("Update/Player/{steamId}/TimeTracked")]
    [ProducesResponseType(Status200OK)]
    [ProducesResponseType(Status404NotFound)]
    public IActionResult UpdatePlayerTimeTracked(Tracker tracker, ulong steamId)
    {
        if (databaseContext.Players.Find(steamId) is not { } player)
            return NotFound();
        tracker.UpdateGameTimesPlayer(databaseContext, player);
        return Ok();
    }

    [HttpPost("Update/All")]
    [ProducesResponseType(Status202Accepted)]
    public IActionResult Update(Tracker tracker)
    {
        tracker.ForceLoop();
        return Accepted();
    }
}