package pneumaticCraft.client.gui;

import java.util.Iterator;

import net.minecraft.client.gui.GuiScreen;
import net.minecraft.client.gui.GuiTextField;
import net.minecraft.client.renderer.InventoryEffectRenderer;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.enchantment.Enchantment;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.init.Items;
import net.minecraft.inventory.InventoryBasic;
import net.minecraft.inventory.Slot;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.util.ResourceLocation;

import org.lwjgl.input.Keyboard;
import org.lwjgl.input.Mouse;
import org.lwjgl.opengl.GL11;

import pneumaticCraft.client.gui.pneumaticHelmet.GuiHelmetMainScreen;
import pneumaticCraft.common.inventory.ContainerSearcher;
import pneumaticCraft.common.item.Itemss;
import pneumaticCraft.lib.Textures;
import cpw.mods.fml.client.FMLClientHandler;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;

@SideOnly(Side.CLIENT)
public class GuiSearcher extends InventoryEffectRenderer{
    private static final ResourceLocation guiTexture = new ResourceLocation(Textures.GUI_ITEM_SEARCHER_LOCATION);
    private static final ResourceLocation scrollTexture = new ResourceLocation("textures/gui/container/creative_inventory/tabs.png");
    private final InventoryBasic inventory = new InventoryBasic("tmp", true, 49);
    private final GuiScreen parentScreen;

    /** Amount scrolled in Creative mode inventory (0 = top, 1 = bottom) */
    private float currentScroll;

    /** True if the scrollbar is being dragged */
    private boolean isScrolling;

    /**
     * True if the left mouse button was held down last time drawScreen was called.
     */
    private boolean wasClicking;
    private GuiTextField searchField;
    private boolean firstRun = true;

    /**
     * Used to back up the ContainerSearcher's inventory slots before filling it with the player's inventory slots for
     * the inventory tab.
     */
    //private List backupContainerSlots;
    private boolean field_74234_w;

    public GuiSearcher(EntityPlayer par1EntityPlayer){
        super(new ContainerSearcher());
        par1EntityPlayer.openContainer = inventorySlots;
        allowUserInput = true;
        ySize = 176;
        parentScreen = FMLClientHandler.instance().getClient().currentScreen;
        ((ContainerSearcher)inventorySlots).init(this);
    }

    public ItemStack getSearchStack(){
        return inventory.getStackInSlot(48);
    }

    public void setSearchStack(ItemStack stack){
        inventory.setInventorySlotContents(48, stack);
    }

    @Override
    protected void handleMouseClick(Slot par1Slot, int par2, int par3, int par4){
        if(par1Slot != null) {
            if(par1Slot.slotNumber == 48) {
                par1Slot.putStack(null);
            } else {
                inventory.setInventorySlotContents(48, par1Slot.getStack());
            }
        }
    }

    /**
     * Adds the buttons (and other controls) to the screen in question.
     */
    @Override
    public void initGui(){
        super.initGui();
        buttonList.clear();
        Keyboard.enableRepeatEvents(true);
        searchField = new GuiTextField(fontRendererObj, guiLeft + 20, guiTop + 36, 89, fontRendererObj.FONT_HEIGHT);
        searchField.setMaxStringLength(15);
        searchField.setEnableBackgroundDrawing(true);
        searchField.setVisible(true);
        searchField.setFocused(true);
        searchField.setTextColor(16777215);

        updateCreativeSearch();
    }

    /**
     * Called when the screen is unloaded. Used to disable keyboard repeat events
     */
    @Override
    public void onGuiClosed(){
        super.onGuiClosed();
        Keyboard.enableRepeatEvents(false);
    }

    @Override
    public void updateScreen(){
        EntityPlayer player = FMLClientHandler.instance().getClient().thePlayer;
        if(parentScreen instanceof GuiHelmetMainScreen) {
            if(player.getCurrentArmor(3) == null || player.getCurrentArmor(3).getItem() != Itemss.pneumaticHelmet) {
                mc.displayGuiScreen(parentScreen);
                onGuiClosed();
            }
        }
    }

    /**
     * Fired when a key is typed. This is the equivalent of KeyListener.keyTyped(KeyEvent e).
     */
    @Override
    protected void keyTyped(char par1, int par2){
        if(field_74234_w) {
            field_74234_w = false;
            searchField.setText("");
        }

        if(par2 == 1)//esc
        {
            mc.displayGuiScreen(parentScreen);
            onGuiClosed();
        } else {
            if(searchField.textboxKeyTyped(par1, par2)) {
                updateCreativeSearch();
            } else {
                super.keyTyped(par1, par2);
            }
        }
    }

    private void updateCreativeSearch(){
        ContainerSearcher containerSearcher = (ContainerSearcher)inventorySlots;
        containerSearcher.itemList.clear();

        Iterator iterator = Item.itemRegistry.iterator();

        while(iterator.hasNext()) {
            Item item = (Item)iterator.next();

            if(item != null && item.getCreativeTab() != null) {
                item.getSubItems(item, (CreativeTabs)null, containerSearcher.itemList);
            }
        }

        Enchantment[] aenchantment = Enchantment.enchantmentsList;
        int j = aenchantment.length;

        for(int i = 0; i < j; ++i) {
            Enchantment enchantment = aenchantment[i];

            if(enchantment != null && enchantment.type != null) {
                Items.enchanted_book.func_92113_a(enchantment, containerSearcher.itemList);
            }
        }

        iterator = containerSearcher.itemList.iterator();
        String s = searchField.getText().toLowerCase();

        while(iterator.hasNext()) {
            ItemStack itemstack = (ItemStack)iterator.next();
            boolean flag = false;
            Iterator iterator1 = itemstack.getTooltip(mc.thePlayer, mc.gameSettings.advancedItemTooltips).iterator();

            while(true) {
                if(iterator1.hasNext()) {
                    String s1 = (String)iterator1.next();

                    if(!s1.toLowerCase().contains(s)) {
                        continue;
                    }

                    flag = true;
                }

                if(!flag) {
                    iterator.remove();
                }

                break;
            }
        }

        currentScroll = 0.0F;
        containerSearcher.scrollTo(0.0F);
    }

    /**
     * Draw the foreground layer for the GuiContainer (everything in front of the items)
     */
    @Override
    protected void drawGuiContainerForegroundLayer(int par1, int par2){
        fontRendererObj.drawString("Item Searcher", 23, 5, 4210752);
        fontRendererObj.drawString("Search Box", 23, 25, 4210752);
        fontRendererObj.drawString("Target", 113, 10, 4210752);
    }

    /**
     * Called when the mouse is clicked.
     */
    @Override
    protected void mouseClicked(int par1, int par2, int par3){

        super.mouseClicked(par1, par2, par3);
    }

    /**
     * Called when the mouse is moved or a mouse button is released.  Signature: (mouseX, mouseY, which) which==-1 is
     * mouseMove, which==0 or which==1 is mouseUp
     */
    @Override
    protected void mouseMovedOrUp(int par1, int par2, int par3){
        super.mouseMovedOrUp(par1, par2, par3);
    }

    /**
     * returns (if you are not on the inventoryTab) and (the flag isn't set) and( you have more than 1 page of items)
     */
    private boolean needsScrollBars(){
        return ((ContainerSearcher)inventorySlots).hasMoreThan1PageOfItemsInList();
    }

    /*
    private void setCurrentCreativeTab(CreativeTabs par1CreativeTabs){
        if(par1CreativeTabs == null) {
            return;
        }

        int i = selectedTabIndex;
        selectedTabIndex = par1CreativeTabs.getTabIndex();
        ContainerSearcher ContainerSearcher = (ContainerSearcher)inventorySlots;
        field_94077_p.clear();
        ContainerSearcher.itemList.clear();
        par1CreativeTabs.displayAllReleventItems(ContainerSearcher.itemList);

        if(par1CreativeTabs == CreativeTabs.tabInventory) {
            Container container = mc.thePlayer.inventoryContainer;

            if(backupContainerSlots == null) {
                backupContainerSlots = ContainerSearcher.inventorySlots;
            }

            ContainerSearcher.inventorySlots = new ArrayList();

            for(int j = 0; j < container.inventorySlots.size(); ++j) {
                SlotCreativeInventory slotcreativeinventory = new SlotCreativeInventory(this, (Slot)container.inventorySlots.get(j), j);
                ContainerSearcher.inventorySlots.add(slotcreativeinventory);
                int k;
                int l;
                int i1;

                if(j >= 5 && j < 9) {
                    k = j - 5;
                    l = k / 2;
                    i1 = k % 2;
                    slotcreativeinventory.xDisplayPosition = 9 + l * 54;
                    slotcreativeinventory.yDisplayPosition = 6 + i1 * 27;
                } else if(j >= 0 && j < 5) {
                    slotcreativeinventory.yDisplayPosition = -2000;
                    slotcreativeinventory.xDisplayPosition = -2000;
                } else if(j < container.inventorySlots.size()) {
                    k = j - 9;
                    l = k % 9;
                    i1 = k / 9;
                    slotcreativeinventory.xDisplayPosition = 9 + l * 18;

                    if(j >= 36) {
                        slotcreativeinventory.yDisplayPosition = 112;
                    } else {
                        slotcreativeinventory.yDisplayPosition = 54 + i1 * 18;
                    }
                }
            }

            field_74235_v = new Slot(inventory, 0, 173, 112);
            ContainerSearcher.inventorySlots.add(field_74235_v);
        } else if(i == CreativeTabs.tabInventory.getTabIndex()) {
            ContainerSearcher.inventorySlots = backupContainerSlots;
            backupContainerSlots = null;
        }

        if(searchField != null) {
            if(par1CreativeTabs == CreativeTabs.tabAllSearch) {
                searchField.setVisible(true);
                searchField.setCanLoseFocus(false);
                searchField.setFocused(true);
                searchField.setText("");
                updateCreativeSearch();
            } else {
                searchField.setVisible(false);
                searchField.setCanLoseFocus(true);
                searchField.setFocused(false);
            }
        }

        currentScroll = 0.0F;
        ContainerSearcher.scrollTo(0.0F);
    }
    */
    /**
     * Handles mouse input.
     */
    @Override
    public void handleMouseInput(){
        super.handleMouseInput();
        int i = Mouse.getEventDWheel();

        if(i != 0 && needsScrollBars()) {
            int j = ((ContainerSearcher)inventorySlots).itemList.size() / 9 - 5 + 1;

            if(i > 0) {
                i = 1;
            }

            if(i < 0) {
                i = -1;
            }

            currentScroll = (float)(currentScroll - (double)i / (double)j);

            if(currentScroll < 0.0F) {
                currentScroll = 0.0F;
            }

            if(currentScroll > 1.0F) {
                currentScroll = 1.0F;
            }

            ((ContainerSearcher)inventorySlots).scrollTo(currentScroll);
        }
    }

    /**
     * Draws the screen and all the components in it.
     */
    @Override
    public void drawScreen(int par1, int par2, float par3){
        boolean flag = Mouse.isButtonDown(0);
        int k = guiLeft;
        int l = guiTop;
        int i1 = k + 156;
        int j1 = l + 48;
        int k1 = i1 + 14;
        int l1 = j1 + 112;
        if(!wasClicking && flag && par1 >= i1 && par2 >= j1 && par1 < k1 && par2 < l1) {
            isScrolling = needsScrollBars();
        }

        if(!flag) {
            isScrolling = false;
        }

        wasClicking = flag;

        if(isScrolling) {
            currentScroll = (par2 - j1 - 7.5F) / (l1 - j1 - 15.0F);

            if(currentScroll < 0.0F) {
                currentScroll = 0.0F;
            }

            if(currentScroll > 1.0F) {
                currentScroll = 1.0F;
            }

            ((ContainerSearcher)inventorySlots).scrollTo(currentScroll);
        }
        if(firstRun) {
            firstRun = false;
            ((ContainerSearcher)inventorySlots).scrollTo(0);
        }

        super.drawScreen(par1, par2, par3);

        GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
        GL11.glDisable(GL11.GL_LIGHTING);
    }

    /**
     * Draw the background layer for the GuiContainer (everything behind the items)
     */
    @Override
    protected void drawGuiContainerBackgroundLayer(float par1, int par2, int par3){
        mc.getTextureManager().bindTexture(guiTexture);
        int xStart = (width - xSize) / 2;
        int yStart = (height - ySize) / 2;
        drawTexturedModalRect(xStart, yStart, 0, 0, xSize, ySize);
        searchField.drawTextBox();

        int i1 = guiLeft + 156;
        int k = guiTop + 48;
        int l = k + 112;
        mc.getTextureManager().bindTexture(scrollTexture);
        drawTexturedModalRect(i1, k + (int)((l - k - 17) * currentScroll), 232 + (needsScrollBars() ? 0 : 12), 0, 12, 15);

    }

    /**
     * Returns the creative inventory
     */
    public InventoryBasic getInventory(){
        return inventory;
    }
}