using System.Text.Json.Serialization;

namespace LittleTown.Core;

/// <summary>
/// Represente un plateau de jeu dans un match
/// Le plateau de littleTown est constitué 9 X 6 cases
/// Chaque case est a un type et peut ou pas contenir un batiment
/// /// </summary>
public class Board
{
    /// <summary> Nombre de colonne dans le plateau </summary>
    public int Width { get; init; }
    /// <summary> Nombre de rangée dans le plateau </summary>
    public int Height { get; init; }


    [JsonInclude]
    private Tile[] Tiles { get; init; } = new Tile[1];

    /// <summary>
    /// Permet de récupéré une tile sur le plateau, le 0,0 étant le bas gauche du plateau, x sur la largeur et y la hauteur
    /// </summary>
    /// <param name="x">la colonne de la tile partant de la gauche a 0</param>
    /// <param name="y">ligne de la tile partant du bas a 0</param>
    /// <returns>la tile</returns>
    public Tile? GetTile(int x, int y)
    {
        if (x < 0 || x >= Width || y < 0 || y >= Height)
            return null;

        return Tiles[x + y * Width];
    }

    /// <summary>Permet de recuperer la liste des tiles autour de la position en parametre </summary>
    /// <param name="x">la colonne au centre de la zone</param>
    /// <param name="y">la rangée du centre de la zone</param>
    /// <returns>une liste des tiles contenant entre 3(coin) et 8(centre) tiles</returns>
    public ICollection<Tile> GetArea(int x, int y)
    {
        List<Tile> result = new List<Tile>();
        for (int ix = -1; ix <= 1; ix++)
        {
            for (int iy = -1; iy <= 1; iy++)
            {
                if (iy != 0 || ix != 0)
                {
                    Tile? t = GetTile(x + ix, y + iy);
                    if (null != t)
                    {
                        result.Add((Tile)t);
                    }
                }
            }
        }
        return result;
    }
}
