package version11_2_2_2.display;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import version11_2_2_2.agnosticMemory.EnvironmentContext;
import version11_2_2_2.agnosticMemory.PredictionNode;
import version11_2_2_2.platform.Agent;

/**
 * Frame to display signatures of interactions
 * @author simon gay
 */

/* - inherited from EnvPanel :
 *   Agent agent      : pointer to the agent
 */
public class NodePanel extends EnvPanel implements MouseListener{

	private static final long serialVersionUID = 1L;
	
	private int clic_x=0;
	private int clic_y=0;
	
	private PredictionNode selected_node;
	
	private int size2=EnvironmentContext.size2;
	
	private int line;
	
	public NodePanel(Agent a){
		super(a);
		addMouseListener(this);
	}
	
	public void setAgent(Agent a){
		agent=a;
	}
	
	public void paintComponent(Graphics g){
		g.setColor(Color.white);
		
		g.fillRect(0, 0, 1600, 900);
		
		line=0;
		
		g.setColor(Color.black);
		
		if (agent.decision.predictionNode!=null){
			
			// base of the node tree
			g.fillOval(50, 50, 20, 20);
			g.drawString(""+agent.decision.predictionNode.id+", "+agent.decision.predictionNode.inter, 75, 65);
			
			for (int i=0;i<agent.decision.predictionNode.nexts.size();i++){
				line++;
				g.drawLine(55,55,55,55+line*15);
				g.drawLine(55,55+line*15,55+50,55+line*15);
				drawNode(g,agent.decision.predictionNode.nexts.get(i));
			}
			
			// draw initial context
			if (agent.decision.predictionNode.context!=null)
			for (int i=0;i<EnvironmentContext.size1;i++){
				for (int j=0;j<EnvironmentContext.size2;j++){
					g.setColor(new Color(Math.max(0,agent.decision.predictionNode.context[i*size2*3+j*3+2]),
										 Math.max(0,agent.decision.predictionNode.context[i*size2*3+j*3  ]),
										 Math.max(0,agent.decision.predictionNode.context[i*size2*3+j*3+1]) ));
					
					g.fillRect(1000+i*15,240-j*15,15,15);
				}
			}
			
			// draw context of selected node
			if (selected_node!=null){
				for (int i=0;i<EnvironmentContext.size1;i++){
					for (int j=0;j<EnvironmentContext.size2;j++){
						g.setColor(new Color(Math.max(0,selected_node.context[i*size2*3+j*3+2]),
											 Math.max(0,selected_node.context[i*size2*3+j*3  ]),
											 Math.max(0,selected_node.context[i*size2*3+j*3+1]) ));
						
						g.fillRect(1000+i*15,500-j*15,15,15);
					}
				}
			}
		}
	}
	
	
	public void drawNode(Graphics g, PredictionNode node){
		
		if (agent.environmentContext.interactionList[node.id].isChange()) g.setColor(Color.red);
		else g.setColor(Color.black);
		g.fillOval(50+50*node.level, 50+15*line, 10, 10);
		
		g.setColor(Color.black);
		g.drawString(""+node.id+", "+node.inter+" ; "+node.prediction+" ; "+agent.environmentContext.interactionList[node.id].length, 70+50*node.level, 60+15*line);
		
		int line2=line;
		
		for (int i=0;i<node.nexts.size();i++){
			line++;
			g.drawLine(55+50*node.level,55+line2*15,55+50*node.level,55+line*15);
			g.drawLine(55+50*node.level,55+line*15,55+50*node.level+50,55+line*15);
			drawNode(g,node.nexts.get(i));
		}
	}
	
	
	///////////////////////////////////////////////////////////////////////////
	public void mouseClicked(MouseEvent e) {

		clic_x=e.getX();
		clic_y=e.getY();
		
		selected_node=null;
		
		if (clic_x>=50 && clic_x<=70 && clic_y>=50 && clic_y<=70){
			selected_node=agent.decision.predictionNode;
			System.out.println(selected_node.id);
		}
		else{
			line=0;
			int i=0;
			
			while (i<agent.decision.predictionNode.nexts.size() && selected_node==null){
				line++;
				selectNode(agent.decision.predictionNode.nexts.get(i));
				i++;
			}
		}
	}
	
	public void selectNode(PredictionNode node){
		
		if (clic_x>=50+50*node.level && clic_x<=70+50*node.level && clic_y>=50+15*line && clic_y<=70+15*line && agent.environmentContext.interactionList[node.id].isChange()){
			selected_node=node;
			System.out.println(selected_node.id);
		}
		else{
			int i=0;
			
			while (i<node.nexts.size() && selected_node==null){
				line++;
				selectNode(node.nexts.get(i));
				i++;
			}
		}
	}
	

	@Override
	public void mouseEntered(MouseEvent e) {}
	public void mouseExited(MouseEvent e) {}
	public void mousePressed(MouseEvent e) {}
	public void mouseReleased(MouseEvent e) {}

}
