#include "stdafx.h"
#include "AbstractContainerScreen.h"
#include "ItemRenderer.h"
#include "MultiplayerLocalPlayer.h"
#include "Lighting.h"
#include "GameMode.h"
#include "KeyMapping.h"
#include "Options.h"
#include "..\Minecraft.World\net.minecraft.world.inventory.h"
#include "..\Minecraft.World\net.minecraft.locale.h"
#include "..\Minecraft.World\net.minecraft.world.item.h"

ItemRenderer *AbstractContainerScreen::itemRenderer = new ItemRenderer();

AbstractContainerScreen::AbstractContainerScreen(AbstractContainerMenu *menu)
{
	// 4J - added initialisers
	imageWidth = 176;
	imageHeight = 166;

	this->menu = menu;
}

void AbstractContainerScreen::init()
{
    Screen::init();
    minecraft->player->containerMenu = menu;
// 	leftPos = (width - imageWidth) / 2;
// 	topPos = (height - imageHeight) / 2;

}

void AbstractContainerScreen::render(int xm, int ym, float a)
{
	// 4J Stu - Not used
#if 0
    renderBackground();
    int xo = (width - imageWidth) / 2;
    int yo = (height - imageHeight) / 2;

    renderBg(a);

    glPushMatrix();
    glRotatef(120, 1, 0, 0);
    Lighting::turnOn();
    glPopMatrix();

    glPushMatrix();
    glTranslatef((float)xo, (float)yo, 0);

    glColor4f(1, 1, 1, 1);
    glEnable(GL_RESCALE_NORMAL);

    Slot *hoveredSlot = NULL;
	
	AUTO_VAR(itEnd, menu->slots->end());
	for (AUTO_VAR(it, menu->slots->begin()); it != itEnd; it++)
	{
        Slot *slot = *it; //menu->slots->at(i);

        renderSlot(slot);

        if (isHovering(slot, xm, ym))
		{
            hoveredSlot = slot;

            glDisable(GL_LIGHTING);
            glDisable(GL_DEPTH_TEST);

            int x = slot->x;
            int y = slot->y;
            fillGradient(x, y, x + 16, y + 16, 0x80ffffff, 0x80ffffff);
            glEnable(GL_LIGHTING);
            glEnable(GL_DEPTH_TEST);
        }
    }

    shared_ptr<Inventory> inventory = minecraft->player->inventory;
    if (inventory->getCarried() != NULL)
	{
        glTranslatef(0, 0, 32);
        // Slot old = carriedSlot;
        // carriedSlot = null;
        itemRenderer->renderGuiItem(font, minecraft->textures, inventory->getCarried(), xm - xo - 8, ym - yo - 8);
        itemRenderer->renderGuiItemDecorations(font, minecraft->textures, inventory->getCarried(), xm - xo - 8, ym - yo - 8);
        // carriedSlot = old;
    }
    glDisable(GL_RESCALE_NORMAL);
    Lighting::turnOff();

    glDisable(GL_LIGHTING);
    glDisable(GL_DEPTH_TEST);

    renderLabels();

    if (inventory->getCarried() == NULL && hoveredSlot != NULL && hoveredSlot->hasItem())
	{

        wstring elementName = trimString(Language::getInstance()->getElementName(hoveredSlot->getItem()->getDescriptionId()));

        if (elementName.length() > 0)
		{
            int x = xm - xo + 12;
            int y = ym - yo - 12;
            int width = font->width(elementName);
            fillGradient(x - 3, y - 3, x + width + 3, y + 8 + 3, 0xc0000000, 0xc0000000);

            font->drawShadow(elementName, x, y, 0xffffffff);
        }

    }

    glPopMatrix();

    Screen::render(xm, ym, a);
    glEnable(GL_LIGHTING);
    glEnable(GL_DEPTH_TEST);
#endif
}

void AbstractContainerScreen::renderLabels()
{
}

void AbstractContainerScreen::renderSlot(Slot *slot)
{
	// 4J Unused
#if 0
    int x = slot->x;
    int y = slot->y;
    shared_ptr<ItemInstance> item = slot->getItem();

    if (item == NULL)
	{
        int icon = slot->getNoItemIcon();
        if (icon >= 0)
		{
            glDisable(GL_LIGHTING);
            minecraft->textures->bind(minecraft->textures->loadTexture(TN_GUI_ITEMS));//L"/gui/items.png"));
            blit(x, y, icon % 16 * 16, icon / 16 * 16, 16, 16);
            glEnable(GL_LIGHTING);
            return;
        }
    }

    itemRenderer->renderGuiItem(font, minecraft->textures, item, x, y);
    itemRenderer->renderGuiItemDecorations(font, minecraft->textures, item, x, y);
#endif
}

Slot *AbstractContainerScreen::findSlot(int x, int y)
{
	AUTO_VAR(itEnd, menu->slots->end());
	for (AUTO_VAR(it, menu->slots->begin()); it != itEnd; it++)
	{
        Slot *slot = *it; //menu->slots->at(i);
        if (isHovering(slot, x, y)) return slot;
    }
    return NULL;
}

bool AbstractContainerScreen::isHovering(Slot *slot, int xm, int ym)
{
    int xo = (width - imageWidth) / 2;
    int yo = (height - imageHeight) / 2;
    xm -= xo;
    ym -= yo;

    return xm >= slot->x - 1 && xm < slot->x + 16 + 1 && ym >= slot->y - 1 && ym < slot->y + 16 + 1;

}

void AbstractContainerScreen::mouseClicked(int x, int y, int buttonNum)
{
    Screen::mouseClicked(x, y, buttonNum);
    if (buttonNum == 0 || buttonNum == 1)
	{
        Slot *slot = findSlot(x, y);

        int xo = (width - imageWidth) / 2;
        int yo = (height - imageHeight) / 2;
        bool clickedOutside = (x < xo || y < yo || x >= xo + imageWidth || y >= yo + imageHeight);

        int slotId = -1;
        if (slot != NULL) slotId = slot->index;

        if (clickedOutside)
		{
            slotId = AbstractContainerMenu::CLICKED_OUTSIDE;
        }

        if (slotId != -1)
		{
            bool quickKey = slotId != AbstractContainerMenu::CLICKED_OUTSIDE && (Keyboard::isKeyDown(Keyboard::KEY_LSHIFT) || Keyboard::isKeyDown(Keyboard::KEY_RSHIFT));
            minecraft->gameMode->handleInventoryMouseClick(menu->containerId, slotId, buttonNum, quickKey, minecraft->player);
        }
    }

}

void AbstractContainerScreen::mouseReleased(int x, int y, int buttonNum)
{
    if (buttonNum == 0)
	{
    }
}

void AbstractContainerScreen::keyPressed(wchar_t eventCharacter, int eventKey)
{
    if (eventKey == Keyboard::KEY_ESCAPE || eventKey == minecraft->options->keyBuild->key)
	{
        minecraft->player->closeContainer();
    }
}

void AbstractContainerScreen::removed()
{
    if (minecraft->player == NULL) return;
}

void AbstractContainerScreen::slotsChanged(shared_ptr<Container> container)
{
}

bool AbstractContainerScreen::isPauseScreen()
{
	return false;
}

void AbstractContainerScreen::tick()
{
    Screen::tick();
    if (!minecraft->player->isAlive() || minecraft->player->removed) minecraft->player->closeContainer();

}