namespace SimsPersonalityGenerator;

public class Sim
{
    public int Niceness { get; private set; }
    public int Neatness { get; private set; }
    public int Outgoingness { get; private set; }
    public int Activeness { get; private set; }
    public int Playfulness { get; private set; }

    public Sim()
    {
        GenerateRandomPersonality();
    }

    public void SetTraitHigher(string trait, bool isHigh)
    {
        switch (trait.ToLower())
        {
            case "niceness":
                if (isHigh)
                    Niceness = Math.Min(10, Neatness + 5);
                else
                    Neatness = Math.Min(10, Niceness + 5);
                break;
            case "neatness":
                if (isHigh)
                    Neatness = Math.Min(10, Activeness + 5);
                else
                    Activeness = Math.Min(10, Neatness + 5);
                break;
            case "outgoingness":
                if (isHigh)
                    Outgoingness = Math.Min(10, Playfulness + 5);
                else
                    Playfulness = Math.Min(10, Outgoingness + 5);
                break;
            case "activeness":
                if (isHigh)
                    Activeness = Math.Min(10, Niceness + 5);
                else
                    Niceness = Math.Min(10, Activeness + 5);
                break;
            case "playfulness":
                if (isHigh)
                    Playfulness = Math.Min(10, Outgoingness + 5);
                else
                    Outgoingness = Math.Min(10, Playfulness + 5);
                break;
            default:
                throw new ArgumentException("Invalid trait name.");
        }
    }

    private void GenerateRandomPersonality()
    {
        Random rand = new Random();
        Niceness = rand.Next(11);
        Neatness = rand.Next(11);
        Outgoingness = rand.Next(11);
        Activeness = rand.Next(11);
        Playfulness = rand.Next(11);

        // Ensure that the sum of traits is balanced
        int totalSum = Niceness + Neatness + Outgoingness + Activeness + Playfulness;
        if (totalSum > 50)
        {
            int overage = totalSum - 50;
            int traitToReduce = rand.Next(5);
            switch (traitToReduce)
            {
                case 0: Niceness -= Math.Min(Niceness, overage); break;
                case 1: Neatness -= Math.Min(Neatness, overage); break;
                case 2: Outgoingness -= Math.Min(Outgoingness, overage); break;
                case 3: Activeness -= Math.Min(Activeness, overage); break;
                case 4: Playfulness -= Math.Min(Playfulness, overage); break;
            }
        }
    }

    public override string ToString()
    {
        return $"Niceness: {Niceness}, Neatness: {Neatness}, Outgoingness: {Outgoingness}, Activeness: {Activeness}, Playfulness: {Playfulness}";
    }
}