using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using RecrownedAthenaeum.Render;
using RecrownedAthenaeum.UI.ScreenSystem;
using System;

namespace RhythmBullet.Screens.Transitions
{
    internal class FadeAwayTransition : IDisposable, ITransition
    {
        private float time;
        public Texture2D curtain;
        public Rectangle curtainSize;
        private Color color;
        private float progR, progG, progB, progA;
        private float rR, rG, rB, rA;

        internal FadeAwayTransition(float time)
        {
            this.time = time;
        }

        public void InitiateTransition(Rectangle dimensions)
        {
            curtainSize = dimensions;
            color = Color.White;
            rR = (0 - 254) / time;
            rG = (0 - 254) / time;
            rB = (0 - 254) / time;
            rA = (0 - 254) / time;

            progA = color.A;
            progR = color.R;
            progG = color.G;
            progB = color.B;
        }

        private bool Fade(float deltaf)
        {
            if (progR > 0 || progG > 0 || progB > 0)
            {
                progR += rR * deltaf;
                progR = Math.Max(progR, 0);
                progG += rG * deltaf;
                progG = Math.Max(progG, 0);
                progB += rB * deltaf;
                progB = Math.Max(progB, 0);
                progA += rA * deltaf;
                progA = Math.Max(progA, 0);
                color.R = (byte)progR;
                color.G = (byte)progG;
                color.B = (byte)progB;
                color.A = (byte)progA;
                return false;
            }
            return true;
        }

        public void DrawTransition(ConsistentSpriteBatch batch)
        {
            if (curtain != null)
            {
                batch.Draw(curtain, curtainSize, color);
            }
        }

        public void Dispose()
        {
            curtain.Dispose();
        }

        public bool UpdateEnteringTransition(double delta, bool assetsLoaded)
        {
            return Fade((float)delta);
        }

        public bool UpdateExitingTransition(double delta, bool assetsLoaded)
        {
            return Fade((float)delta);
        }

        public void UpdatePreviousScreenFrame(RenderTarget2D previousScreenFrame)
        {
            curtain = previousScreenFrame;
        }
    }
}
