package pneumaticCraft.client.gui;

import java.awt.Point;
import java.util.ArrayList;
import java.util.List;

import net.minecraft.client.resources.I18n;
import net.minecraft.entity.player.InventoryPlayer;
import net.minecraft.init.Blocks;
import net.minecraft.init.Items;
import net.minecraft.item.ItemStack;
import net.minecraft.util.EnumChatFormatting;
import pneumaticCraft.PneumaticCraft;
import pneumaticCraft.client.gui.widget.IGuiWidget;
import pneumaticCraft.client.gui.widget.WidgetAmadronOffer;
import pneumaticCraft.client.gui.widget.WidgetTextField;
import pneumaticCraft.client.gui.widget.WidgetVerticalScrollbar;
import pneumaticCraft.common.inventory.ContainerAmadron;
import pneumaticCraft.common.inventory.ContainerAmadron.EnumProblemState;
import pneumaticCraft.common.network.NetworkHandler;
import pneumaticCraft.common.network.PacketAmadronOrderUpdate;
import pneumaticCraft.common.recipes.AmadronOffer;
import pneumaticCraft.common.util.PneumaticCraftUtils;
import pneumaticCraft.lib.Textures;

public class GuiAmadron extends GuiPneumaticContainerBase{
    private WidgetTextField searchBar;
    private WidgetVerticalScrollbar scrollbar;
    private int page;
    private final List<WidgetAmadronOffer> widgetOffers = new ArrayList<WidgetAmadronOffer>();
    private boolean needsRefreshing;
    private boolean hadProblem = false;
    private GuiButtonSpecial addTradeButton;

    public GuiAmadron(InventoryPlayer playerInventory){
        super(new ContainerAmadron(playerInventory.player), null, Textures.GUI_AMADRON);
        xSize = 176;
        ySize = 202;
    }

    @Override
    public void initGui(){
        super.initGui();
        String amadron = I18n.format("gui.amadron");
        addLabel(amadron, guiLeft + xSize / 2 - mc.fontRenderer.getStringWidth(amadron) / 2, guiTop + 5);
        addLabel(I18n.format("gui.search"), guiLeft + 76 - mc.fontRenderer.getStringWidth(I18n.format("gui.search")), guiTop + 41);

        addInfoTab(I18n.format("gui.tooltip.item.amadronTablet"));
        addAnimatedStat("gui.tab.info.ghostSlotInteraction.title", new ItemStack(Blocks.hopper), 0xFF00AAFF, true).setText("gui.tab.info.ghostSlotInteraction");
        addAnimatedStat("gui.tab.amadron.disclaimer.title", new ItemStack(Items.writable_book), 0xFF0000FF, true).setText("gui.tab.amadron.disclaimer");

        searchBar = new WidgetTextField(mc.fontRenderer, guiLeft + 79, guiTop + 40, 73, mc.fontRenderer.FONT_HEIGHT);
        addWidget(searchBar);

        scrollbar = new WidgetVerticalScrollbar(-1, guiLeft + 156, guiTop + 54, 142);
        scrollbar.setStates(1);
        scrollbar.setListening(true);
        addWidget(scrollbar);

        List<String> tooltip = PneumaticCraftUtils.convertStringIntoList(I18n.format("gui.amadron.button.order.tooltip"), 40);
        addWidget(new GuiButtonSpecial(1, guiLeft + 6, guiTop + 15, 72, 20, I18n.format("gui.amadron.button.order")).setTooltipText(tooltip));
        addTradeButton = new GuiButtonSpecial(2, guiLeft + 80, guiTop + 15, 72, 20, I18n.format("gui.amadron.button.addTrade"));
        addWidget(addTradeButton);

        updateVisibleOffers();
    }

    @Override
    public void updateScreen(){
        super.updateScreen();
        ContainerAmadron container = (ContainerAmadron)inventorySlots;
        if(needsRefreshing || page != scrollbar.getState()) {
            setPage(scrollbar.getState());
        }
        for(WidgetAmadronOffer offer : widgetOffers) {
            offer.setCanBuy(container.buyableOffers[container.offers.indexOf(offer.getOffer())]);
            offer.setShoppingAmount(container.getShoppingCartAmount(offer.getOffer()));
        }
        if(!hadProblem && container.problemState != EnumProblemState.NO_PROBLEMS) {
            problemTab.openWindow();
        }
        hadProblem = container.problemState != EnumProblemState.NO_PROBLEMS;
        addTradeButton.enabled = container.currentOffers < container.maxOffers;
        List<String> tooltip = PneumaticCraftUtils.convertStringIntoList(I18n.format("gui.amadron.button.addTrade.tooltip"), 40);
        tooltip.add((addTradeButton.enabled ? EnumChatFormatting.GRAY : EnumChatFormatting.RED) + I18n.format("gui.amadron.button.addTrade.tooltip.offerCount", container.currentOffers, container.maxOffers == Integer.MAX_VALUE ? "\u221E" : container.maxOffers));
        addTradeButton.setTooltipText(tooltip);
    }

    public void setPage(int page){
        this.page = page;
        updateVisibleOffers();
    }

    public void updateVisibleOffers(){
        needsRefreshing = false;
        final ContainerAmadron container = (ContainerAmadron)inventorySlots;
        int invSize = ContainerAmadron.ROWS * 2;
        container.clearStacks();
        List<AmadronOffer> offers = container.offers;
        List<AmadronOffer> visibleOffers = new ArrayList<AmadronOffer>();
        int skippedOffers = 0;
        int applicableOffers = 0;
        for(AmadronOffer offer : offers) {
            if(offer.passesQuery(searchBar.getText())) {
                applicableOffers++;
                if(skippedOffers < page * invSize) {
                    skippedOffers++;
                } else if(visibleOffers.size() < invSize) {
                    visibleOffers.add(offer);
                }
            }
        }

        scrollbar.setStates(Math.max(1, (applicableOffers + invSize - 1) / invSize - 1));

        widgets.removeAll(widgetOffers);
        for(int i = 0; i < visibleOffers.size(); i++) {
            AmadronOffer offer = visibleOffers.get(i);
            if(offer.getInput() instanceof ItemStack) container.setStack(i * 2, (ItemStack)offer.getInput());
            if(offer.getOutput() instanceof ItemStack) container.setStack(i * 2 + 1, (ItemStack)offer.getOutput());

            WidgetAmadronOffer widget = new WidgetAmadronOffer(i, guiLeft + 6 + 73 * (i % 2), guiTop + 55 + 35 * (i / 2), offer){
                @Override
                public void onMouseClicked(int mouseX, int mouseY, int button){
                    NetworkHandler.sendToServer(new PacketAmadronOrderUpdate(container.offers.indexOf(getOffer()), button, PneumaticCraft.proxy.isSneakingInGui()));
                }
            };
            addWidget(widget);
            widgetOffers.add(widget);
        }
    }

    @Override
    public void onKeyTyped(IGuiWidget widget){
        super.onKeyTyped(widget);
        needsRefreshing = true;
        scrollbar.setCurrentState(0);
    }

    @Override
    public void actionPerformed(IGuiWidget widget){

        super.actionPerformed(widget);
    }

    @Override
    protected Point getInvTextOffset(){
        return null;
    }

    @Override
    protected void addProblems(List curInfo){
        super.addProblems(curInfo);
        EnumProblemState problemState = ((ContainerAmadron)inventorySlots).problemState;
        if(problemState != EnumProblemState.NO_PROBLEMS) {
            curInfo.add(problemState.getLocalizationKey());
        }
    }
}