package version11_2_2_1.display;

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

import version11_2_2_1.platform.Agent;
import version11_2_2_1.Interface.InteractionList;

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

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

	private static final long serialVersionUID = 1L;
	
	private int clic_x=0;
	private int clic_y=0;
	
	private int selected_color=0;
	
	private int pixel=10;
	
	private int size1=InteractionList.size1;
	private int size2=InteractionList.size2;
	
	private boolean threshold=false;
	
	public ContextPanel(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, 1050, 900);
		
		//////////////////////////////////////////////////////////////
		// draw interactional context
		
		// draw actions
		
		for (int t=10;t>=0;t--){
			g.setColor(Color.black);
			if (agent.environmentContext.enactedActions[t][0]==1){
				g.drawString(">", 20, 60*t+25);
			}
			if (agent.environmentContext.enactedActions[t][1]==1){
				g.drawString("^", 20, 60*t+25);
			}
			if (agent.environmentContext.enactedActions[t][2]==1){
				g.drawString("v", 20, 60*t+25);
			}
			
			if (agent.environmentContext.enactedActions[t][3]==1){
				g.setColor(Color.green);
				g.fillOval(35, 60*t+15, 15, 15);
			}
			if (agent.environmentContext.enactedActions[t][4]==1){
				g.setColor(Color.blue);
				g.fillOval(50, 60*t+15, 15, 15);
			}
		}
		
		for (int t=10;t>=0;t--){
			for (int j=InteractionList.size2-1;j>=0;j--){
				for (int i=0;i<InteractionList.size1;i++){
					if (agent.environmentContext.perceptions[t][i*size2*3+j*3+2]!=0 ||
						agent.environmentContext.perceptions[t][i*size2*3+j*3  ]!=0 ||
						agent.environmentContext.perceptions[t][i*size2*3+j*3+1]!=0){
						g.setColor(new Color(agent.environmentContext.perceptions[t][i*size2*3+j*3+2]*255,
							 			 agent.environmentContext.perceptions[t][i*size2*3+j*3  ]*255,
							 			 agent.environmentContext.perceptions[t][i*size2*3+j*3+1]*255 ));
		
						g.fillOval(350+i*pixel-j*9, (InteractionList.size2-j)*pixel/2+60*t, pixel, pixel);
					}
					else{
						g.setColor(Color.gray);
						g.fillOval(350+i*pixel-j*9, (InteractionList.size2-j)*pixel/2+60*t, 2, 2);
					}
				}
			}
		}
		
		// draw enacted interaction
		
		//for (int i2=0;i2<5;i2++){
			//for (int j2=0;j2<11;j2++){
			
				g.setColor(Color.black);
				g.fillRect(700, 10, 500, 10);
				for (int i=0;i<5;i++){
					for (int j=0;j<5;j++){
						if ((i+j)%2==0) g.setColor(Color.darkGray);
						else g.setColor(Color.gray);
						g.fillRect(700+100*j , 20+100*i , 100, 100);
					}
				}
			//}
		//}
				
		if (agent.environmentContext.enactedInteraction!=null){
			int x=agent.environmentContext.enactedInteraction.events.get(0)[0]*10+agent.environmentContext.enactedInteraction.events.get(0)[1];
			int y=-1;
			if (agent.environmentContext.enactedInteraction.getSize()>1){
				y=agent.environmentContext.enactedInteraction.events.get(1)[0]*10+agent.environmentContext.enactedInteraction.events.get(1)[1];
			}
			
			if (agent.environmentContext.enactedInteraction.perception==0) g.setColor(Color.red);
			else if (agent.environmentContext.enactedInteraction.perception==1) g.setColor(Color.green);
			else if (agent.environmentContext.enactedInteraction.perception==2) g.setColor(Color.blue);
			
			g.fillRect(700+10*x, 20+10*y, 10, 10);
		}
		
		
		// draw delta
		g.setColor(Color.yellow);
		for (int i=0;i<2550;i++){
			int x1=i%50;
			int y1=i/50;
			
			if (agent.environmentContext.delta[i].size()>0){
				g.fillOval(700+10*x1+4, 20+10*y1-6, 2, 2);
				
				if (agent.environmentContext.delta[i].size()>1){
				for (int j=0;j<agent.environmentContext.delta[i].size();j++){
					int x2=agent.environmentContext.delta[i].get(j)%50;
					int y2=agent.environmentContext.delta[i].get(j)/50;
					
					g.drawLine(700+10*x1+5, 20+10*y1-5, 700+10*x2+5, 20+10*y2-5);
				}
				}
			}
		}
	}
	
	
	
	///////////////////////////////////////////////////////////////////////////
	public void mouseClicked(MouseEvent e) {

		clic_x=e.getX();
		clic_y=e.getY();
		
		float dmin=1000;
		float d=10;
		
		int offset=0;
		for (int n=0;n<5;n++){
			offset=n*120;
			for (int i=0;i<InteractionList.size1;i++){
				for (int j=0;j<InteractionList.size2;j++){
					d=(clic_x-(20+i*pixel))*(clic_x-(20+i*pixel) ) + (clic_y - (120-j*pixel+offset))*(clic_y - (120-j*pixel+offset));
					if (d<dmin){
						dmin=d;
						agent.observer.setSelectedNode(i*size2*3 + j*3 + n*size1*size2*3 + selected_color);
					}
				}
			}
		}

		for (int i=0;i<5;i++){
			d=(clic_x-(25+i*20))*(clic_x-(25+i*20) ) + (clic_y - 755)*(clic_y - 755);
			if (d<dmin){
				dmin=d;
				agent.observer.setSelectedNode(InteractionList.nbDF + i);
			}
		}
		
		
		
		for (int i=0;i<3;i++){
			d=(clic_x-(265))*(clic_x-(265) ) + (clic_y - (35+20*i))*(clic_y - (35+20*i));
			if (d<dmin){
				dmin=d;
				selected_color=i;
			}
		}
		
		d=(clic_x-(265))*(clic_x-(265) ) + (clic_y - (125))*(clic_y - (125));
		if (d<dmin){
			threshold=!threshold;
		}

		System.out.println("+++++ "+agent.observer.getSelectedNode()+" : "
				+agent.signatureList.get(agent.observer.getSelectedNode()).getPrediction()+" ; "
				+agent.signatureList.get(agent.observer.getSelectedNode()).average_delta1+" ; "+agent.signatureList.get(agent.observer.getSelectedNode()).average_delta2);
		
		
	}

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

}
