#include "screenfader.hpp"

namespace MWGui
{

    ScreenFader::ScreenFader()
        : WindowBase("openmw_screen_fader.layout")
        , mMode(FadingMode_In)
        , mRemainingTime(0.f)
        , mTargetTime(0.f)
        , mTargetAlpha(0.f)
        , mCurrentAlpha(0.f)
        , mStartAlpha(0.f)
        , mFactor(1.f)
    {
        mMainWidget->setSize(MyGUI::RenderManager::getInstance().getViewSize());

        setVisible(false);
    }

    void ScreenFader::update(float dt)
    {
        if (mRemainingTime > 0)
        {
            if (mMode == FadingMode_In)
            {
                mCurrentAlpha -= dt/mTargetTime * (mStartAlpha-mTargetAlpha);
                if (mCurrentAlpha < mTargetAlpha) mCurrentAlpha = mTargetAlpha;
            }
            else if (mMode == FadingMode_Out)
            {
                mCurrentAlpha += dt/mTargetTime * (mTargetAlpha-mStartAlpha);
                if (mCurrentAlpha > mTargetAlpha) mCurrentAlpha = mTargetAlpha;
            }

            mRemainingTime -= dt;
        }

        if (1.f-((1.f-mCurrentAlpha) * mFactor) == 0.f)
            mMainWidget->setVisible(false);
        else
            applyAlpha();
    }

    void ScreenFader::applyAlpha()
    {
        setVisible(true);
        mMainWidget->setAlpha(1.f-((1.f-mCurrentAlpha) * mFactor));
    }

    void ScreenFader::fadeIn(float time)
    {
        if (time<0.f) return;
        if (time==0.f)
        {
            mCurrentAlpha = 0.f;
            applyAlpha();
            return;
        }

        mStartAlpha = mCurrentAlpha;
        mTargetAlpha = 0.f;
        mMode = FadingMode_In;
        mTargetTime = time;
        mRemainingTime = time;
    }

    void ScreenFader::fadeOut(const float time)
    {
        if (time<0.f) return;
        if (time==0.f)
        {
            mCurrentAlpha = 1.f;
            applyAlpha();
            return;
        }

        mStartAlpha = mCurrentAlpha;
        mTargetAlpha = 1.f;
        mMode = FadingMode_Out;
        mTargetTime = time;
        mRemainingTime = time;
    }

    void ScreenFader::fadeTo(const int percent, const float time)
    {
        if (time<0.f) return;
        if (time==0.f)
        {
            mCurrentAlpha = percent/100.f;
            applyAlpha();
            return;
        }

        mStartAlpha = mCurrentAlpha;
        mTargetAlpha = percent/100.f;

        if (mTargetAlpha == mStartAlpha) return;
        else if (mTargetAlpha > mStartAlpha) mMode = FadingMode_Out;
        else mMode = FadingMode_In;

        mTargetTime = time;
        mRemainingTime = time;
    }

    void ScreenFader::setFactor(float factor)
    {
        mFactor = factor;
    }

}