package gui;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.util.HashMap;
import java.awt.event.MouseListener;
import javax.swing.JPanel;

public class RobotDirectionPanel extends JPanel 
{
    private HashMap brick_images_;
    private Image current_image_;
    private int internal_state_;
    private boolean changeable_;
    public final static int UP = 1;
    public final static int RIGHT = 2;
    public final static int DOWN = 3;
    public final static int LEFT = 4;
    public final static int STATE_COUNT = 4;
    
    public RobotDirectionPanel(HashMap brick_images) 
    {
        super();
        changeable_=true;
        brick_images_ = brick_images;
        internal_state_ = UP;
        current_image_ = (Image) brick_images_.get("ARROW_UP");
        initMouseListener();
    }

    public RobotDirectionPanel(HashMap brick_images, int init_state) 
    {
        super();
        changeable_=true;
        brick_images_ = brick_images;
        setInternalState(init_state);
        initMouseListener();
    }
    
    public void paintComponent(Graphics g) 
    {
        super.paintComponent(g);
        g.drawImage(current_image_, 0, 0, this);
    }

    private void setInternalState(int new_state) 
    {
        if ((new_state >= UP) && (new_state <= LEFT))
            internal_state_ = new_state;
        else
        	System.err.println("Direction must be >= " + UP + " <= " + LEFT);    
        paintState();
    }

    public int getInternalState() 
    {
        return internal_state_;
    }
    
    private void paintState() 
    {
        switch (internal_state_) 
        {
        case UP:
            current_image_ = (Image) brick_images_.get("ARROW_UP");
            break;
        case RIGHT:
            current_image_ = (Image) brick_images_.get("ARROW_RIGHT");
            break;
        case DOWN:
            current_image_ = (Image) brick_images_.get("ARROW_DOWN");
            break;
        case LEFT:
            current_image_ = (Image) brick_images_.get("ARROW_LEFT");
            break;
        }
        RobotDirectionPanel.this.repaint();
    }
    
    public void setChangeable(boolean change)
    {
    	changeable_=change;
    	MouseListener[] mls = (MouseListener[])(this.getListeners(MouseListener.class));
    	if (changeable_==true && mls.length==0)
    	{
    		initMouseListener();
		}
    	else if (changeable_==false && mls.length >=1)
    	{
    		removeMouseListener();
		}
	}
		
	public boolean getChangeable()
	{
		return changeable_;
	}
    
    private void initMouseListener() 
    {
	    MouseListener[] mls = (MouseListener[])(this.getListeners(MouseListener.class));
		if(mls.length==0)
		{
        this.addMouseListener(new java.awt.event.MouseAdapter() 
        {
            public void mouseClicked(java.awt.event.MouseEvent evt) 
            {
                internal_state_ = ((internal_state_++) % STATE_COUNT) + 1;
                String direction = "";
                switch (internal_state_)
                {
                case 1:
                	direction = "Forward";
                	break;
                case 2:
                	direction = "Right";
                	break;
                case 3:
                	direction = "Backward";
                	break;
                case 4:
                	direction = "Left";
                	break;
                default:
                	direction = "Unknown (error)";
                }
                //SqlCommunicator.add_log("Rule " + Integer.toString(parent_rule_) + ": Direction changed to " + direction);
                paintState();
            }
        });
    	}
    }
    
    private void removeMouseListener()
    {
	    MouseListener[] mls = (MouseListener[])(this.getListeners(MouseListener.class));
	    this.removeMouseListener(mls[0]);
	} 
}