package gamegui;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.FontMetrics;
import java.awt.Font;
import java.util.ArrayList;

public class Menu extends Member {
    private ArrayList<String> items;
    private int selectedIndex;
    private String label;
    private Font font;
    private boolean open;
    private FontMetrics metrics;
    
    public Menu(final String newName, final int newX, final int newY, final int newWidth, final int newHeight, final String newLabel, final Font newFont) {
        super(newName, newX, newY, newWidth, newHeight);
        this.items = new ArrayList<String>();
        this.selectedIndex = -1;
        this.label = newLabel;
        this.font = newFont;
        this.open = false;
    }
    
    @Override
    public boolean handleEvent(final MouseEvent e) {
        if (this.getX() + this.metrics.stringWidth(this.label) + 4 <= e.getX() && e.getX() <= this.getX() + this.getWidth() && this.getY() + this.getHeight() <= e.getY() && e.getY() <= this.getY() + this.getHeight() + 15 * this.items.size() && this.open) {
            this.selectedIndex = (e.getY() - this.getY() - this.getHeight()) / 15;
            this.open = false;
            return true;
        }
        if (this.getX() + this.getWidth() - this.getHeight() <= e.getX() && e.getX() <= this.getX() + this.getWidth() && this.getY() <= e.getY() && e.getY() <= this.getY() + this.getHeight()) {
            this.open = !this.open;
            return true;
        }
        return false;
    }
    
    @Override
    public void clear() {
        if (this.selectedIndex != -1) {
            this.selectedIndex = 0;
        }
    }
    
    @Override
    public void draw(final Graphics g) {
        this.metrics = g.getFontMetrics(this.font);
        g.setColor(Color.black);
        g.fillRect(this.getX(), this.getY(), this.getWidth(), this.getHeight());
        g.setColor(Color.red);
        g.drawRect(this.getX(), this.getY(), this.getWidth(), this.getHeight());
        g.drawLine(this.getX() + this.metrics.stringWidth(this.label) + 4, this.getY(), this.getX() + this.metrics.stringWidth(this.label) + 4, this.getY() + this.getHeight());
        g.drawLine(this.getX() + this.getWidth() - this.getHeight(), this.getY(), this.getX() + this.getWidth() - this.getHeight(), this.getY() + this.getHeight());
        g.drawLine(this.getX() + this.getWidth() - this.getHeight() * 17 / 20, this.getY() + this.getHeight() * 3 / 20, this.getX() + this.getWidth() - this.getHeight() * 3 / 20, this.getY() + this.getHeight() * 3 / 20);
        g.drawLine(this.getX() + this.getWidth() - this.getHeight() * 17 / 20, this.getY() + this.getHeight() * 3 / 20, this.getX() + this.getWidth() - this.getHeight() / 2, this.getY() + this.getHeight() * 17 / 20);
        g.drawLine(this.getX() + this.getWidth() - this.getHeight() / 2, this.getY() + this.getHeight() * 17 / 20, this.getX() + this.getWidth() - this.getHeight() * 3 / 20, this.getY() + this.getHeight() * 3 / 20);
        g.setColor(Color.green);
        g.setFont(this.font);
        g.drawString(this.label, this.getX() + 2, this.getY() + (this.getHeight() + this.metrics.getHeight()) / 2 - 2);
        g.drawString(this.items.get(this.selectedIndex), this.getX() + this.metrics.stringWidth(this.label) + 8, this.getY() + (this.getHeight() + this.metrics.getHeight()) / 2 - 2);
        if (this.open) {
            g.setColor(Color.black);
            g.fillRect(this.getX() + this.metrics.stringWidth(this.label) + 4, this.getY() + this.getHeight(), this.getWidth() - this.metrics.stringWidth(this.label) - 4, this.items.size() * 15);
            g.setColor(Color.red);
            g.drawRect(this.getX() + this.metrics.stringWidth(this.label) + 4, this.getY() + this.getHeight(), this.getWidth() - this.metrics.stringWidth(this.label) - 4, this.items.size() * 15);
            if (this.selectedIndex != -1) {
                g.setColor(Color.blue);
                g.fillRect(this.getX() + this.metrics.stringWidth(this.label) + 5, this.getY() + this.getHeight() + 1 + 15 * this.selectedIndex, this.getWidth() - this.metrics.stringWidth(this.label) - 5, 14);
            }
            g.setColor(Color.green);
            for (int x = 0; x < this.items.size(); ++x) {
                g.drawString(this.items.get(x), this.getX() + this.metrics.stringWidth(this.label) + 8, this.getY() + (this.getHeight() + this.metrics.getHeight()) / 2 + 15 * (x + 1));
            }
        }
    }
    
    public void add(final String newString) {
        this.selectedIndex = 0;
        this.items.add(newString);
    }
    
    public String getSelected() {
        return this.items.get(this.selectedIndex);
    }
}
