using LittleTown.Core.Enums;

namespace LittleTown.Core;
/// <summary> Représente les données propre à un joueur </summary>
public class PlayerZone : ICloneable
{
    /// <summary> Les ressources que possede le joueur </summary>
    public IDictionary<ResourceType, int> Ressources { get; init; } = new Dictionary<ResourceType, int>();

    /// <summary> l'id du joueur a cette zone </summary>
    public required string PlayerName { get; init; }

    /// <summary> La liste des objectifs que le joueur possede/// </summary>
    public IReadOnlyCollection<Objective> Objectives { get => _objectives.AsReadOnly(); init => _objectives = new List<Objective>(value); }
    private List<Objective> _objectives = new List<Objective>();

    /// <summary> Le marqueur de score pendant le match </summary>
    public int ScoreMarker { get; init; }

    /// <summary> Permet d'ajouter d'une type de ressources au stock du joueur </summary>
    /// <param name="res">le type de ressources</param>
    /// <param name="qte">la quantité non nulle non négative</param>
    public void AddRessources(ResourceType res, int qte)
    {
        ArgumentOutOfRangeException.ThrowIfLessThan(qte, 1);
        if (Ressources.ContainsKey(res))
        {
            Ressources[res] += qte;
        }
        else
        {
            Ressources.Add(res, qte);
        }
    }

    /// <summary>
    /// Assigner des objectifs au joueur
    /// </summary>
    /// <param name="objectives"></param>
    public void AddObjectives(ICollection<Objective> objectives)
    {
        _objectives.AddRange(objectives);
    }

    /// <summary> Cloner ce playerZone </summary>
    /// <returns>Une copie de l'objet</returns>
    public object Clone()
    {
        PlayerZone result = new PlayerZone()
        {
            Ressources = new Dictionary<ResourceType, int>(Ressources),
            Objectives = new List<Objective>(Objectives),
            ScoreMarker = ScoreMarker,
            PlayerName = PlayerName
        };

        return result;
    }
}