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

using osu.Framework.MathUtils;
using osu.Game.Rulesets.Catch.Objects;
using osu.Game.Rulesets.Catch.UI;
using osu.Game.Rulesets.Mods;
using System;
using osu.Game.Rulesets.Objects;

namespace osu.Game.Rulesets.Catch.Mods
{
    public class CatchModHardRock : ModHardRock, IApplicableToHitObject
    {
        public override double ScoreMultiplier => 1.12;
        public override bool Ranked => true;

        private float lastStartX;
        private int lastStartTime;

        public void ApplyToHitObject(HitObject hitObject)
        {
            var catchObject = (CatchHitObject)hitObject;

            float position = catchObject.X;
            int startTime = (int)hitObject.StartTime;

            if (lastStartX == 0)
            {
                lastStartX = position;
                lastStartTime = startTime;
                return;
            }

            float diff = lastStartX - position;
            int timeDiff = startTime - lastStartTime;

            if (timeDiff > 1000)
            {
                lastStartX = position;
                lastStartTime = startTime;
                return;
            }

            if (diff == 0)
            {
                bool right = RNG.NextBool();

                float rand = Math.Min(20, (float)RNG.NextDouble(0, timeDiff / 4d)) / CatchPlayfield.BASE_WIDTH;

                if (right)
                {
                    if (position + rand <= 1)
                        position += rand;
                    else
                        position -= rand;
                }
                else
                {
                    if (position - rand >= 0)
                        position -= rand;
                    else
                        position += rand;
                }

                catchObject.X = position;

                return;
            }

            if (Math.Abs(diff) < timeDiff / 3d)
            {
                if (diff > 0)
                {
                    if (position - diff > 0)
                        position -= diff;
                }
                else
                {
                    if (position - diff < 1)
                        position -= diff;
                }
            }

            catchObject.X = position;

            lastStartX = position;
            lastStartTime = startTime;
        }
    }
}