package gui;
import java.awt.Graphics;
import java.awt.Image;
import javax.swing.JPanel;
import java.util.HashMap;
import java.awt.event.MouseListener;

public class RobotBottomSensorPanel extends JPanel {
    public final static int EMPTY_FLOOR = 0;
    public final static int FLOOR_0 = 1;
    public final static int FLOOR_1 = 2;
    public final static int FLOOR_2 = 3;
    public final static int FLOOR_3 = 4;
	public final static int FLOOR_4 = 5;
    public final static int STATE_COUNT = 5;
    private HashMap brick_images_;
    private int internal_state_;
    private boolean changeable_;
    private Image current_image_;
    
	private TUGLabyrinth labyrinth_;
	
	public RobotBottomSensorPanel(HashMap brick_images, TUGLabyrinth labyrinth) 
	{
        super();
		labyrinth_=labyrinth;
        brick_images_ = brick_images;
        changeable_=true;
        internal_state_ = EMPTY_FLOOR;
        current_image_ = (Image) brick_images_.get("EMPTY_FLOOR");
        //this.setToolTipText("Anklicken um den Sensortyp zu ändern.");
        initMouseListener();
    }

    public RobotBottomSensorPanel(HashMap brick_images, int init_state, TUGLabyrinth labyrinth) 
    {
        super();
		labyrinth_=labyrinth;
        brick_images_ = brick_images;
        changeable_=true;
        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 >= EMPTY_FLOOR)
            internal_state_ = new_state;
		else
        	System.err.println("State must be >=" + EMPTY_FLOOR);	
        paintState();
    }

    public int getInternalState() 
    {
        return internal_state_;
    }
    
    
  private void paintState() 
  {
        switch (internal_state_) 
        {
        case EMPTY_FLOOR:
            current_image_ = (Image) brick_images_.get("EMPTY_FLOOR");
						this.setToolTipText("Anklicken um den Zustand zu ändern.");
            break;
        case FLOOR_0:
            current_image_ = (Image) brick_images_.get("FLOOR_0");
						this.setToolTipText("Markierung: "+labyrinth_.mark_array_.getFromInt(internal_state_-1));
            break;
        case FLOOR_1:
            current_image_ = (Image) brick_images_.get("FLOOR_1");
						this.setToolTipText("Markierung: "+labyrinth_.mark_array_.getFromInt(internal_state_-1));
            break;
        case FLOOR_2:
            current_image_ = (Image) brick_images_.get("FLOOR_2");
						this.setToolTipText("Markierung: "+labyrinth_.mark_array_.getFromInt(internal_state_-1));
            break;
        case FLOOR_3:
            current_image_ = (Image) brick_images_.get("FLOOR_3");
						this.setToolTipText("Markierung: "+labyrinth_.mark_array_.getFromInt(internal_state_-1));
            break;
				default:
						current_image_ = (Image) brick_images_.get("FLOOR_4");
						this.setToolTipText("Markierung: "+labyrinth_.mark_array_.getFromInt(internal_state_-1));
						break;
        }
        RobotBottomSensorPanel.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();
		}
		else
		{
			System.out.println("\n setChangeable("+changeable_+"), MouseListener: "+mls.length);	
		}
	}
		
	public boolean getChangeable()
	{
		return changeable_;
	}
		
	private void initMouseListener() 
	{
		MouseListener[] mls = (MouseListener[])(this.getListeners(MouseListener.class));
		System.out.println("\n MouseListenercount" + mls.length);
		if(mls.length==0)
		{
		System.out.println("\n initMouseListener");
        this.addMouseListener(new java.awt.event.MouseAdapter() 
        {
            public void mouseClicked(java.awt.event.MouseEvent evt) 
            {
                internal_state_ = (internal_state_ + 1) % (STATE_COUNT);
               // SqlCommunicator.add_log("Rule " + Integer.toString(parent_rule_) + ": Floor sensor changed to " + Integer.toString(internal_state_));
                paintState();
            }
        });
    	}	
    }
    
    private void removeMouseListener()
    {
	    MouseListener[] mls = (MouseListener[])(this.getListeners(MouseListener.class));
	    this.removeMouseListener(mls[0]);
	} 
}