using System.Security.Cryptography;
using API.Models.DataClasses;
using API.Models.Game;

namespace API.Repository.GameRepo;

public class GameRepository : IGameRepository
{
    private List<Game> _games = [];
    public List<Game> GetAll()
    {
        return _games;
    }

    public Game? GetOne(string id)
    {
        return _games.FirstOrDefault(g => g.Id == id);
    }
    
    public Game? GetOne(SixDigitInt gameCode)
    {
        return _games.FirstOrDefault(g => g.GameCode == gameCode);
    }

    public Game? GetOneByConnectionId(string connectionId)
    {
        return _games.FirstOrDefault(g => g.Players.Any(p => p.ConnectionId == connectionId));
    }

    public Game Create(Coordinates gameFieldSize)
    {
        Game newGame = new(gameFieldSize, GenerateGameCode());
        _games.Add(newGame);
        
        return newGame;
    }

    public void Destroy(string id)
    {
        _games.RemoveAll(g => g.Id == id);
    }

    private SixDigitInt GenerateGameCode()
    {
        while (true)
        {
            var value = RandomNumberGenerator.GetInt32(100000, 1000000);

            var exists = _games.Any(g => g.GameCode.Value == value);
            if (!exists)
            {
                return new SixDigitInt(value);
            }
        }
    }
}