#include "PrecompiledHeader.h"

#include "IconButton.h"
#include "WResourceManager.h"
#include "WFont.h"

#define SCALE_SELECTED      1.2f
#define SCALE_NORMAL        1.0f

 IconButtonsController::IconButtonsController(JGE* jge, float x, float y): JGuiController(jge, 0, NULL), mX(x), mY(y)
 {
     mListener = this;

 }
    
void IconButtonsController::SetColor(PIXEL_TYPE color)
{
    for (int i = 0; i < mCount; ++i)
        if (mObjects[i])
            ((IconButton *)mObjects[i])->SetColor(color);
}

IconButton::IconButton(int id, IconButtonsController * parent, string texture, float x, float y, float scale, int fontId, string text, float textRelativeX, float textRelativeY, bool hasFocus): JGuiObject(id)
{
    mQuad = NULL;
    mTex = WResourceManager::Instance()->RetrieveTexture(texture, RETRIEVE_LOCK);
    if (mTex)
    {
        mQuad = NEW JQuad(mTex, 0, 0, (float) mTex->mWidth, (float) mTex->mHeight);
    }
    init(parent, mQuad, x, y, scale, fontId, text, textRelativeX, textRelativeY, hasFocus);
}

IconButton::IconButton(int id, IconButtonsController * parent, JQuad * quad, float x, float y, float scale, int fontId, string text, float textRelativeX, float textRelativeY, bool hasFocus): JGuiObject(id)
{
    mTex = NULL;
    init(parent, quad, x, y, scale, fontId, text, textRelativeX, textRelativeY, hasFocus);
}

void IconButton::init(IconButtonsController * parent, JQuad * quad, float x, float y, float scale, int fontId, string text, float textRelativeX, float textRelativeY, bool hasFocus)
{
    mParent = parent;
    mQuad = quad;
    mX = x;
    mY = y;
    mScale = scale;
    mFontId = fontId;
    mText = text;
    mTextRelativeX = textRelativeX;
    mTextRelativeY = textRelativeY;
    mHasFocus = hasFocus;

    mCurrentScale = scale;
    mTargetScale =  mHasFocus ? SCALE_SELECTED * mScale : SCALE_NORMAL * mScale;
    SetColor(ARGB(255,255,255,255));
}

void IconButton::SetColor(PIXEL_TYPE color)
{
    mColor = color;
}

bool IconButton::hasFocus()
{
    return mHasFocus;
}

void IconButton::Render()
{
    JRenderer * r = JRenderer::GetInstance();

    float relX = mX + mParent->mX;
    float relY = mY + mParent->mY;

    if (mQuad)
    {
        mQuad->SetColor(mColor);
        r->RenderQuad(mQuad, relX, relY, 0, mCurrentScale, mCurrentScale);
    }
    if (mText.size())
    {
        WFont * mFont = WResourceManager::Instance()->GetWFont(mFontId);
        PIXEL_TYPE backup = mFont->GetColor();
        mFont->SetColor(ARGB(255,0,0,0));
        //TODO adapt if mTextRelativeX/Y/align are negative/positive
        mFont->DrawString(mText.c_str(), relX + mTextRelativeX  , relY + mTextRelativeY , JGETEXT_CENTER);
        mFont->SetColor(backup);
    }

}

void IconButton::Update(float dt)
{
    if (mCurrentScale < mTargetScale)
    {
        mCurrentScale += 8.0f * dt;
        if (mCurrentScale > mTargetScale) mCurrentScale = mTargetScale;
    }
    else if (mCurrentScale > mTargetScale)
    {
        mCurrentScale -= 8.0f * dt;
        if (mCurrentScale < mTargetScale) mCurrentScale = mTargetScale;
    }
}

void IconButton::Entering()
{
    mHasFocus = true;
    mTargetScale = SCALE_SELECTED * mScale;
}

bool IconButton::Leaving(JButton)
{
    mHasFocus = false;
    mTargetScale = SCALE_NORMAL * mScale;
    return true;
}

bool IconButton::ButtonPressed()
{
    return true;
}

IconButton::~IconButton()
{
    if (mTex)
    {
        WResourceManager::Instance()->Release(mTex);
        SAFE_DELETE(mQuad);
    }

}

ostream& IconButton::toString(ostream& out) const
{
    return out << "IconButton ::: mHasFocus : " << mHasFocus;
}
