package codechicken.nei.config;

import codechicken.core.gui.GuiCCButton;
import codechicken.core.gui.GuiScreenWidget;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.GuiScreen;
import org.lwjgl.input.Keyboard;

import java.awt.*;
import java.io.IOException;
import java.util.*;
import java.util.List;

import static codechicken.lib.gui.GuiDraw.drawMultilineTip;
import static codechicken.lib.gui.GuiDraw.fontRenderer;
import static codechicken.lib.gui.GuiDraw.getMousePosition;
import static net.minecraft.util.StatCollector.translateToLocal;

public abstract class GuiOptionPane extends GuiScreenWidget
{
    public class ScrollPane extends OptionScrollPane
    {
        @Override
        public int contentHeight() {
            return GuiOptionPane.this.contentHeight();
        }

        @Override
        public void drawContent(int mx, int my, float frame) {
            GuiOptionPane.this.drawContent(mx, my, frame);
        }
    }

    public abstract int contentHeight();
    public abstract void drawContent(int mx, int my, float frame);

    public ScrollPane pane;
    public GuiCCButton backButton;

    public Rectangle drawBounds() {
        Rectangle w = pane.windowBounds();
        w.y -= pane.scrolledPixels();
        return w;
    }

    @Override
    public void initGui() {
        xSize = width;
        ySize = height;
        super.initGui();

        if (pane != null) {
            pane.resize();
            backButton.width = Math.min(200, width - 40);
            backButton.x = (width - backButton.width) / 2;
            backButton.y = height - 25;
        }
    }

    @Override
    public void addWidgets() {
        add(pane = new ScrollPane());
        add(backButton = new GuiCCButton(0, 0, 0, 20, translateToLocal("nei.options.back")).setActionCommand("back"));
        initGui();
    }

    @Override
    public void actionPerformed(String ident, Object... params) {
        if (ident.equals("back"))
            Minecraft.getMinecraft().displayGuiScreen(getParentScreen());
    }

    @Override
    public void keyTyped(char c, int keycode) throws IOException {
        if (keycode == Keyboard.KEY_ESCAPE || keycode == Keyboard.KEY_BACK) {
            Minecraft.getMinecraft().displayGuiScreen(getParentScreen());
            return;
        }
        super.keyTyped(c, keycode);
    }

    public abstract GuiScreen getParentScreen();

    @Override
    public void drawBackground() {
        drawDefaultBackground();
    }

    @Override
    public void drawForeground() {
        drawCenteredString(fontRenderer, getTitle(), width / 2, 6, -1);
        drawTooltip();
    }

    public void drawTooltip() {
        Point mouse = getMousePosition();
        drawMultilineTip(mouse.x + 12, mouse.y - 12, handleTooltip(mouse.x, mouse.y, new LinkedList<String>()));
    }

    public List<String> handleTooltip(int mx, int my, List<String> tooltip) {
        return tooltip;
    }

    public abstract String getTitle();

    @Override
    public boolean doesGuiPauseGame() {
        return false;
    }
}