// Copyright (c) 2007-2018 ppy Pty Ltd <contact@ppy.sh>.
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE

using System;
using System.Collections.Generic;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Framework.MathUtils;
using osu.Game.Rulesets.Catch.Objects;
using osu.Game.Rulesets.Catch.Objects.Drawable;
using osu.Game.Rulesets.Catch.Objects.Drawable.Pieces;
using osu.Game.Tests.Visual;
using OpenTK;
using OpenTK.Graphics;

namespace osu.Game.Rulesets.Catch.Tests
{
    public class TestCaseFruitObjects : OsuTestCase
    {
        public override IReadOnlyList<Type> RequiredTypes => new[]
        {
            typeof(CatchHitObject),
            typeof(Fruit),
            typeof(Droplet),
            typeof(DrawableCatchHitObject),
            typeof(DrawableFruit),
            typeof(DrawableDroplet),
            typeof(Pulp),
        };

        public TestCaseFruitObjects()
        {
            Add(new GridContainer
            {
                RelativeSizeAxes = Axes.Both,
                Content = new[]
                {
                    new Drawable[]
                    {
                        createDrawable(0),
                        createDrawable(1),
                        createDrawable(2),
                    },
                    new Drawable[]
                    {
                        createDrawable(3),
                        createDrawable(4),
                        createDrawable(5),
                    },
                }
            });
        }

        private DrawableFruit createDrawable(int index)
        {
            var fruit = new Fruit
            {
                StartTime = 1000000000000,
                IndexInBeatmap = index,
                Scale = 1.5f,
            };

            fruit.ComboColour = colourForRrepesentation(fruit.VisualRepresentation);

            return new DrawableFruit(fruit)
            {
                Anchor = Anchor.Centre,
                RelativePositionAxes = Axes.Both,
                Position = Vector2.Zero,
                Alpha = 1,
                LifetimeStart = double.NegativeInfinity,
                LifetimeEnd = double.PositiveInfinity,
            };
        }

        private Color4 colourForRrepesentation(FruitVisualRepresentation representation)
        {
            switch (representation)
            {
                default:
                case FruitVisualRepresentation.Pear:
                    return new Color4(17, 136, 170, 255);
                case FruitVisualRepresentation.Grape:
                    return new Color4(204, 102, 0, 255);
                case FruitVisualRepresentation.Raspberry:
                    return new Color4(121, 9, 13, 255);
                case FruitVisualRepresentation.Pineapple:
                    return new Color4(102, 136, 0, 255);
                case FruitVisualRepresentation.Banana:
                    switch (RNG.Next(0, 3))
                    {
                        default:
                            return new Color4(255, 240, 0, 255);
                        case 1:
                            return new Color4(255, 192, 0, 255);
                        case 2:
                            return new Color4(214, 221, 28, 255);
                    }
            }
        }
    }
}