﻿using OpenTK;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Game.Modes.Objects.Drawables;
using osu.Game.Modes.Lolisu.Objects;
using osu.Game.Modes.Lolisu.Objects.Drawables;
using osu.Game.Modes.UI;
using System.Linq;

namespace osu.Game.Modes.Lolisu.UI
{
    public class LolisuPlayfield : Playfield
    {
        private Container approachHands;
        private Container judgementLayer;

        public override Vector2 Size
        {
            get
            {
                var parentSize = Parent.DrawSize;
                var aspectSize = parentSize.X * 0.75f < parentSize.Y ? new Vector2(parentSize.X, parentSize.X * 0.75f) : new Vector2(parentSize.Y * 4f / 3f, parentSize.Y);

                return new Vector2(aspectSize.X / parentSize.X, aspectSize.Y / parentSize.Y) * base.Size;
            }
        }

        public LolisuPlayfield()
        {
            Anchor = Anchor.Centre;
            Origin = Anchor.Centre;
            RelativeSizeAxes = Axes.Both;
            Size = new Vector2(0.75f);

            Add(new Drawable[]
            {
                judgementLayer = new Container
                {
                    RelativeSizeAxes = Axes.Both,
                    Depth = 1,
                },
                approachHands = new Container
                {
                    RelativeSizeAxes = Axes.Both,
                    Depth = -1,
                }
            });
        }

        public override void Add(DrawableHitObject h)
        {
            h.Depth = (float)h.HitObject.StartTime;
            DrawableHitNote c = h as DrawableHitNote;
            if (c != null)
            {
                approachHands.Add(c.ApproachHand.CreateProxy());
            }

            h.OnJudgement += judgement;

            base.Add(h);
        }

        private void judgement(DrawableHitObject h, JudgementInfo j)
        {
            HitExplosion explosion = new HitExplosion((LolisuJudgementInfo)j, (LolisuHitObject)h.HitObject);

            judgementLayer.Add(explosion);
        }
    }
}
