using System.Linq;
using Content.Shared.Preferences;
using Content.Shared.Preferences.Appearance;
using Content.Shared.Text;
using Robust.Shared.Interfaces.Random;
using Robust.Shared.Random;

namespace Content.Client.UserInterface
{
    public partial class HumanoidProfileEditor
    {
        private readonly IRobustRandom _random;

        private void RandomizeEverything()
        {
            RandomizeSex();
            RandomizeAge();
            RandomizeName();
            RandomizeAppearance();
        }

        private void RandomizeSex()
        {
            SetSex(_random.Prob(0.5f) ? Sex.Male : Sex.Female);
            UpdateSexControls();
        }

        private void RandomizeAge()
        {
            SetAge(_random.Next(HumanoidCharacterProfile.MinimumAge, HumanoidCharacterProfile.MaximumAge));
            UpdateAgeEdit();
        }

        private void RandomizeName()
        {
            var firstName = _random.Pick(Profile.Sex == Sex.Male
                ? Names.MaleFirstNames
                : Names.FemaleFirstNames);
            var lastName = _random.Pick(Names.LastNames);
            SetName($"{firstName} {lastName}");
            UpdateNameEdit();
        }

        private void RandomizeAppearance()
        {
            var newHairStyle = _random.Pick(HairStyles.HairStylesMap.Keys.ToList());

            var newFacialHairStyle = Profile.Sex == Sex.Female
                ? HairStyles.DefaultFacialHairStyle
                : _random.Pick(HairStyles.FacialHairStylesMap.Keys.ToList());

            var newHairColor = _random.Pick(HairStyles.RealisticHairColors);
            newHairColor = newHairColor
                .WithRed(newHairColor.R + _random.Next(-25, 25) / 100f)
                .WithGreen(newHairColor.G + _random.Next(-25, 25) / 100f)
                .WithBlue(newHairColor.B + _random.Next(-25, 25) / 100f);

            Profile = Profile.WithCharacterAppearance(
                Profile.Appearance
                    .WithHairStyleName(newHairStyle)
                    .WithFacialHairStyleName(newFacialHairStyle)
                    .WithHairColor(newHairColor)
                    .WithFacialHairColor(newHairColor));
            UpdateHairPickers();
        }
    }
}
