package gui;

import javax.swing.JPanel;
import javax.swing.Scrollable;
import java.util.HashMap;
import java.awt.Color;
import java.util.ArrayList;
import java.awt.Dimension;

import controller.InstructionList;

public class RuleTreePanel extends javax.swing.JPanel
{
	private static final int CONDITION_HEIGHT = 80;
	private static final int CONDITION_WIDTH = 230;
	private HashMap brick_images_;
	private TUGLabyrinth labyrinth_;
	private int rule_count_;
	private ArrayList rule_list_;
	private Dimension start_dimension_;

	public RuleTreePanel(HashMap brick_images, TUGLabyrinth labyrinth)
    {
	    //super();
        this.setLayout(null);
		labyrinth_=labyrinth;
        this.setBackground(Color.ORANGE);
        brick_images_ = brick_images;
        start_dimension_ = this.getSize();
        rule_list_= new ArrayList();
        rule_count_=0;
    }

    public RuleTreePanel(HashMap brick_images, TUGLabyrinth labyrinth, Dimension dimension)
    {
	    super();
	    this.setLayout(null);
		labyrinth_=labyrinth;
        this.setBackground(Color.ORANGE);
        brick_images_ = brick_images;
        rule_list_= new ArrayList();
        rule_count_=0;

	    start_dimension_=dimension;
		this.setSize(start_dimension_ );
		this.repaint();
	}

    public void drawAllRules()
    {
        this.removeAll();
        for (int index = 0; index < rule_list_.size(); index++)
        {
            RulePositionPanel tmp = (RulePositionPanel) rule_list_.get(index);
            this.add(tmp);
            tmp.setBounds(0, (rule_list_.size()-index-1) * CONDITION_HEIGHT, CONDITION_WIDTH,
                    CONDITION_HEIGHT);
            tmp.repaint();
        }

       adjustSize();
    }

    public void deleteAllRules()
	{
		rule_list_.clear();
		this.removeAll();
		adjustSize();
	}

	public void deleteRule(int id)
	{
		for (int index = 0; index < rule_list_.size(); index++)
        {
	        RulePositionPanel tmp=(RulePositionPanel)rule_list_.get(index);
	        if(tmp.getID()==id)
	        {
		        rule_list_.remove(index);
		        this.remove(tmp);
		        rule_count_--;
		    }
        }
        drawAllRules();
	}

    public void addEmptyRule(int id)
    {
	    RulePositionPanel rule = new RulePositionPanel( new RulePanel(brick_images_, labyrinth_, id, this) );
	    rule_list_.add(rule);
	    //this.add(rule);
	    //rule.setBounds(0, rule_count_ * CONDITION_HEIGHT, CONDITION_WIDTH, CONDITION_HEIGHT);
        rule_count_++;
       // rule.setHighlighting (true);
        //adjustSize();
        drawAllRules();
	}

	public RulePanel getRule(int id)
	{
		RulePanel ret_rule=null;

		for (int index = 0; index < rule_list_.size(); index++)
        {
	        RulePositionPanel tmp=(RulePositionPanel)rule_list_.get(index);
	        if(tmp.getID()==id)
	        {
		      ret_rule = (RulePanel)tmp.getRulePanel();
		    }
        }

        System.out.println("\n rule_list_.size()-->"+ rule_list_.size());

        if(ret_rule == null)
			ret_rule = new RulePanel(brick_images_, labyrinth_, id, this);

        return ret_rule;
	}

	public ArrayList getRuleList()
	{
		return rule_list_;
	}

	public void setRuleList(ArrayList rule_list)
	{
		rule_list_=rule_list;
		drawAllRules();
	}

	private void adjustSize()
	{
		if ((rule_count_) * CONDITION_HEIGHT > start_dimension_.getHeight())
		{
           this.setSize(new Dimension(CONDITION_WIDTH, (rule_count_) * CONDITION_HEIGHT));
           this.setPreferredSize(new Dimension(CONDITION_WIDTH, (rule_count_) * CONDITION_HEIGHT));
        }
        else
        {
           this.setSize(start_dimension_ );
        }
        this.repaint();
	}
}