package version7_2_8.display;

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

import version7_2_8.platform.Agent;
import version7_2_8.agnosticMemory.*;


public class SignaturePanel extends EnvPanel implements MouseListener{
	
	private static final long serialVersionUID = 1L;
	
	public int clic_x=0;
	public int clic_y=0;
	
	private int pixel=4;
	
	private int size1=EnvironmentContext.size1;
	private int size2=EnvironmentContext.size2;
	
	private int selected_node=0;
	
	private int selectedObjectSequence=0;
	private int selectedObjectEvoked=0;
	
	private int display=0;
	
	public SignaturePanel(Agent a){
		super(a);
		addMouseListener(this);
	}
	
	public void paintComponent(Graphics g){
		g.setColor(Color.white);
		
		g.fillRect(0, 0, 1050, 900);
		
		//////////////////////////////////////////////////////////////
		// draw interactional context
		
		// dynamic features
		for (int i=0;i<size1;i++){
			for (int j=0;j<size2;j++){
				
				g.setColor(new Color(agent.environmentContext.map[0][i*size2*3+j*3+2],
									 agent.environmentContext.map[0][i*size2*3+j*3  ],
									 agent.environmentContext.map[0][i*size2*3+j*3+1] ));
				
				g.fillRect(20+i*pixel, (110-j*pixel), pixel, pixel);
			}
			
		}
		
		// primitive interactions
		for (int i=0;i<7;i++){
			g.setColor(new Color(1-(agent.environmentContext.map[0][EnvironmentContext.nbDF+i]/2+0.5f),
								    agent.environmentContext.map[0][EnvironmentContext.nbDF+i]/2+0.5f,0));

			g.fillRect(20+i*20, 120, 10, 10);
			
			if (i==selected_node){
				g.setColor(Color.black);
				g.drawRect(19+i*20, 119, 11, 11);
			}
		}
		
		///////////////////////////////////////////////////////////////////////////////
		// display switch
		if (display==0) g.setColor(Color.red);
		else g.setColor(Color.green);
		g.fillRect(50, 400, 10, 10);
		
		///////////////////////////////////////////////////////////////////////////////
		// draw sequences
		
		int index=0;
		if (display==0){
			for (int i=0;i<agent.agnosticMemory.sequencesList.size();i++){
				if (agent.agnosticMemory.sequencesList.get(i).isValide() && agent.agnosticMemory.sequencesList.get(i).objectTypeId==2){
					
					if ((i==agent.agnosticMemory.selectedSequence)) g.setColor(Color.red);
					else g.setColor(Color.black);
					
					g.fillRect(14+150*(int)(index/30), 445+15*(index%30), 5, 5);
					
					g.setColor(Color.black);
					g.drawString(agent.agnosticMemory.sequencesList.get(i).getName(), 20+150*(int)(index/30), 450+15*(index%30));
					index++;
				}
			}
		}
		if (display==1){
			for (int i=0;i<agent.agnosticMemory.objectList.size();i++){
				
				if ((i==agent.agnosticMemory.selectedObject)) g.setColor(Color.red);
				else g.setColor(Color.black);
				
				g.fillRect(14, 445+15*i, 5, 5);
				
				g.setColor(Color.black);	
				g.drawString(agent.agnosticMemory.objectList.get(i).getName(), 25, 450+15*(i));
			}
			
			if (agent.agnosticMemory.selectedObject<agent.agnosticMemory.objectList.size()){
				for (int i=0;i<agent.agnosticMemory.objectList.get(agent.agnosticMemory.selectedObject).memory.size();i++){
					
					if ((i==selectedObjectSequence)) g.setColor(Color.red);
					else g.setColor(Color.black);
					g.fillRect(160, 445+15*i, 5, 5);
					
					g.setColor(Color.black);	
					g.drawString(agent.agnosticMemory.objectList.get(agent.agnosticMemory.selectedObject).memory.get(i).getName()+", "
							    +(float)((int)(agent.agnosticMemory.objectList.get(agent.agnosticMemory.selectedObject).memoryCoef.get(i)*100))/100, 170, 450+15*(i));
				}
				
				for (int i=0;i<agent.agnosticMemory.objectList.get(agent.agnosticMemory.selectedObject).evoked.size();i++){
					
					if ((i==selectedObjectEvoked)) g.setColor(Color.red);
					else g.setColor(Color.black);
					g.fillRect(610, 445+15*i, 5, 5);
					
					g.setColor(Color.black);	
					g.drawString(agent.agnosticMemory.objectList.get(agent.agnosticMemory.selectedObject).evoked.get(i).getName()+" , "
							    +(float)((int)(agent.agnosticMemory.objectList.get(agent.agnosticMemory.selectedObject).evokedCoef.get(i)*100))/100, 620, 450+15*(i));
				}
				
				
				for (int i=0;i<7;i++){
					for (int s=0;s<agent.agnosticMemory.objectList.get(agent.agnosticMemory.selectedObject).evokedLists[i].size();s++){
						
						g.setColor(Color.black);	
						g.drawString(agent.agnosticMemory.objectList.get(agent.agnosticMemory.selectedObject).evokedLists[i].get(s).getName()+" , "
								    +(float)((int)(agent.agnosticMemory.objectList.get(agent.agnosticMemory.selectedObject).evokedListCoefs[i].get(s)*100))/100,
								    1150+220*i, 450+15*(s));
					}
				}
			}
		}
		
		float gray=0;
		for (int i=EnvironmentContext.size1/3;i<EnvironmentContext.size1*2-EnvironmentContext.size1/3;i++){
			for (int j=0;j<EnvironmentContext.size2*2;j++){

				if (display==0)
					gray= Math.max(0,Math.min(1, (agent.agnosticMemory.sequencesList.get(agent.agnosticMemory.selectedSequence).signature.pattern[i][j]/2+0.5f)));
				if (display==1){
					if (agent.agnosticMemory.objectList.size()>agent.agnosticMemory.selectedObject)
						gray= Math.max(0,Math.min(1, (agent.agnosticMemory.objectList.get(agent.agnosticMemory.selectedObject).map[i][j]/4+0.5f)));
				}
				
				g.setColor(new Color(gray,gray,gray));
				g.fillRect(520+i*pixel, (350-j*pixel), pixel, pixel);
				
				if (display==1){
					if (agent.agnosticMemory.objectList.size()>agent.agnosticMemory.selectedObject && agent.agnosticMemory.objectList.get(agent.agnosticMemory.selectedObject).memory.size()>selectedObjectSequence)
						gray= Math.max(0,Math.min(1, (agent.agnosticMemory.objectList.get(agent.agnosticMemory.selectedObject).memory.get(selectedObjectSequence).signature.pattern[i][j]/2+0.5f)));
					
					g.setColor(new Color(gray,gray,gray));
					g.fillRect(790+i*pixel, (580-j*pixel), pixel, pixel);
					
					if (agent.agnosticMemory.objectList.size()>agent.agnosticMemory.selectedObject && agent.agnosticMemory.objectList.get(agent.agnosticMemory.selectedObject).evoked.size()>selectedObjectEvoked)
						gray= Math.max(0,Math.min(1, (agent.agnosticMemory.objectList.get(agent.agnosticMemory.selectedObject).evoked.get(selectedObjectEvoked).signature.pattern[i][j]/2+0.5f)));
					
					g.setColor(new Color(gray,gray,gray));
					g.fillRect(790+i*pixel, (800-j*pixel), pixel, pixel);
				}
			}
		}
		
		
		////////////////////////////////////////////////////////////////////////////
		// draw interaction map
		for (int i=0;i<EnvironmentContext.size1;i++){
			for (int j=0;j<EnvironmentContext.size2;j++){
				if (agent.agnosticMemory.interactionList.get(selected_node).interactionMap[i][j]==0) g.setColor(Color.red);
				else if (agent.agnosticMemory.interactionList.get(selected_node).interactionMap[i][j]==1) g.setColor(Color.green);
				else if (agent.agnosticMemory.interactionList.get(selected_node).interactionMap[i][j]==2) g.setColor(Color.blue);
				
				else if (agent.agnosticMemory.interactionList.get(selected_node).interactionMap[i][j]==3) g.setColor(Color.magenta);
				else if (agent.agnosticMemory.interactionList.get(selected_node).interactionMap[i][j]==4) g.setColor(Color.cyan);
				else if (agent.agnosticMemory.interactionList.get(selected_node).interactionMap[i][j]==5) g.setColor(Color.yellow);
				else if (agent.agnosticMemory.interactionList.get(selected_node).interactionMap[i][j]==6) g.setColor(Color.orange);
				else g.setColor(Color.black);
				
				
				g.fillRect(480+i*pixel, (110-j*pixel), pixel, pixel);
			}
		}
		
		// draw object map (for the prey object)
		int area=0;
		int dist=0;
		for (int i=0;i<EnvironmentContext.size1*2;i+=2){
			for (int j=0;j<EnvironmentContext.size2*2;j+=2){
					area=agent.agnosticMemory.interactionList.get(2).interactionMap2[i][j];
					dist=agent.agnosticMemory.interactionList.get(2).distanceMap[i][j];
					if (area>=0){
						if (agent.agnosticMemory.mapObjects[2][area][dist])g.setColor(Color.blue);
						else g.setColor(Color.black);
					}
					else g.setColor(Color.black);
					
					g.fillRect(700+i*pixel/2, (110-j*pixel/2), pixel, pixel);
			}
		}

		for (int i=EnvironmentContext.size1/3;i<EnvironmentContext.size1*2-EnvironmentContext.size1/3;i++){
			for (int j=20;j<EnvironmentContext.size2*2;j++){

				if (agent.agnosticMemory.interactionList.get(selected_node).interactionMap2[i][j]==0) 
					g.setColor(new Color(20+15*agent.agnosticMemory.interactionList.get(selected_node).distanceMap[i][j],0,0));
				else if (agent.agnosticMemory.interactionList.get(selected_node).interactionMap2[i][j]==1) 
					g.setColor(Color.green);
				else if (agent.agnosticMemory.interactionList.get(selected_node).interactionMap2[i][j]==2) 
					g.setColor(Color.orange);
				
				else if (agent.agnosticMemory.interactionList.get(selected_node).interactionMap2[i][j]==3) 
					g.setColor(new Color(20+15*agent.agnosticMemory.interactionList.get(selected_node).distanceMap[i][j],0,20+15*agent.agnosticMemory.interactionList.get(selected_node).distanceMap[i][j]));
				else if (agent.agnosticMemory.interactionList.get(selected_node).interactionMap2[i][j]==4)
					g.setColor(new Color(0,20+15*agent.agnosticMemory.interactionList.get(selected_node).distanceMap[i][j],20+15*agent.agnosticMemory.interactionList.get(selected_node).distanceMap[i][j]));
				else if (agent.agnosticMemory.interactionList.get(selected_node).interactionMap2[i][j]==5)
					g.setColor(new Color(20+15*agent.agnosticMemory.interactionList.get(selected_node).distanceMap[i][j],20+15*agent.agnosticMemory.interactionList.get(selected_node).distanceMap[i][j],0));
				else if (agent.agnosticMemory.interactionList.get(selected_node).interactionMap2[i][j]==6)
					g.setColor(new Color(0,0,20+15*agent.agnosticMemory.interactionList.get(selected_node).distanceMap[i][j]));
				else g.setColor(Color.black);
				

				if (agent.agnosticMemory.objectPointMax[0][i][j]==1 || agent.agnosticMemory.objectPointMax[1][i][j]==1 || agent.agnosticMemory.objectPointMax[2][i][j]==1){
					g.setColor(new Color(Math.max(0,Math.min(255, (agent.agnosticMemory.objectPointMax[0][i][j]*255))),
							 Math.max(0,Math.min(255, (agent.agnosticMemory.objectPointMax[1][i][j]*255))),
							 Math.max(0,Math.min(255, (agent.agnosticMemory.objectPointMax[2][i][j]*255)))));
				}
				
				g.fillRect(20+(-EnvironmentContext.size1/3+i)*pixel, (350-j*pixel), pixel, pixel);
				
				g.setColor(Color.white);
				g.fillRect(20+(EnvironmentContext.size1-EnvironmentContext.size1/3)*pixel, 350-EnvironmentContext.size2*pixel, pixel, pixel);
			}
		}
		
		for (int i=EnvironmentContext.size1/3;i<EnvironmentContext.size1*2-EnvironmentContext.size1/3;i++){
			for (int j=0;j<EnvironmentContext.size2*2;j++){
				g.setColor(new Color(Math.max(0,Math.min(1, (agent.agnosticMemory.objectRecognition2[0][i][j]*100))),
									 Math.max(0,Math.min(1, (agent.agnosticMemory.objectRecognition2[1][i][j]*100))),
									 Math.max(0,Math.min(1, (agent.agnosticMemory.objectRecognition2[2][i][j]*100)))));
				
				g.fillRect(300+(-EnvironmentContext.size1/3+i)*pixel, (350-j*pixel), pixel, pixel);
			}
		}
	
		if (display==0){
			for (int i=EnvironmentContext.size1/3;i<EnvironmentContext.size1*2-EnvironmentContext.size1/3;i++){
				for (int j=0;j<EnvironmentContext.size2*2;j++){
					
					g.setColor(new Color(Math.max(0,Math.min(255, (agent.agnosticMemory.objectPointMax[0][i][j]*255))),
										 Math.max(0,Math.min(255, (agent.agnosticMemory.objectPointMax[1][i][j]*255))),
										 Math.max(0,Math.min(255, (agent.agnosticMemory.objectPointMax[2][i][j]*255)))));
					
					g.fillRect(860+(-EnvironmentContext.size1/3+i)*pixel, (350-j*pixel), pixel, pixel);
				}
			}
		}
		if (display==1){
			
			for (int i=EnvironmentContext.size1/3;i<EnvironmentContext.size1*2-EnvironmentContext.size1/3;i++){
				for (int j=0;j<EnvironmentContext.size2*2;j++){
					
					if (agent.agnosticMemory.objectList.size()>agent.agnosticMemory.selectedObject)
						gray= Math.max(0,Math.min(1, (agent.agnosticMemory.objectList.get(agent.agnosticMemory.selectedObject).map2[i][j]/4+0.5f)));
					
					g.setColor(new Color(gray,gray,gray));
					g.fillRect(860+(-EnvironmentContext.size1/3+i)*pixel, (350-j*pixel), pixel, pixel);
				}
			}
		}
		
		///////////////////////////////////////////////////////////////////////////////
		// draw signature
		if (selected_node!=-1){
			// signature
			for (int i=0;i<EnvironmentContext.size1;i++){
				for (int j=0;j<EnvironmentContext.size2;j++){
					g.setColor(new Color(Math.max(0,Math.min(1, (agent.agnosticMemory.interactionList.get(selected_node).blurPattern[i][j][2]/2+0.5f))),
									 	 Math.max(0,Math.min(1, (agent.agnosticMemory.interactionList.get(selected_node).blurPattern[i][j][0]/2+0.5f))),
									 	 Math.max(0,Math.min(1, (agent.agnosticMemory.interactionList.get(selected_node).blurPattern[i][j][1]/2+0.5f)))));
					
					g.fillRect(250+i*pixel, (110-j*pixel), pixel, pixel);
				}
			}/**/
			
		}
	}
	
	
	
	///////////////////////////////////////////////////////////////////////////
	@Override
	public void mouseClicked(MouseEvent e) {

		clic_x=e.getX();
		clic_y=e.getY();
		float dmin=1000;
		float d=10;
		
		d=(clic_x-55)*(clic_x-55) + (clic_y - 405)*(clic_y - 405);
		if (d<dmin){
			dmin=d;
			display=(display+1)%2;
		}
		
		for (int i=0;i<7;i++){
			d=(clic_x-(25+i*20))*(clic_x-(25+i*20) ) + (clic_y - 135)*(clic_y - 135);
			if (d<dmin){
				dmin=d;
				selected_node= i;
			}
		}
		
		//////////////////////////////////////////////////////////////////////
		int index=0;
		if (display==0){
			for (int l=0;l<agent.agnosticMemory.sequencesList.size();l++){
	
				if (agent.agnosticMemory.sequencesList.get(l).isValide() && agent.agnosticMemory.sequencesList.get(l).objectTypeId==2){
					d=(clic_x-(16+152*(index/30)))*(clic_x-(16+152*(index/30)) ) + (clic_y - (448+15*(index%30)))*(clic_y - (448+15*(index%30)));
					if (d<dmin){
						dmin=d;
						agent.agnosticMemory.selectedSequence= l;
					}
					index++;
				}
			}
		}
		/////////////////////////////////////////////////////////////////////
		if (display==1){
			for (int l=0;l<agent.agnosticMemory.objectList.size();l++){
				d=(clic_x-16)*(clic_x-16) + (clic_y - (448+15*l))*(clic_y - (448+15*l));
				if (d<dmin){
					dmin=d;
					agent.agnosticMemory.selectedObject= l;
				}
			}
			
			if (agent.agnosticMemory.selectedObject<agent.agnosticMemory.objectList.size()){
				for (int i=0;i<agent.agnosticMemory.objectList.get(agent.agnosticMemory.selectedObject).memory.size();i++){
					d=(clic_x-162)*(clic_x-162) + (clic_y - (448+15*i))*(clic_y - (448+15*i));
					if (d<dmin){
						dmin=d;
						selectedObjectSequence= i;
					}

				}
				
				for (int i=0;i<agent.agnosticMemory.objectList.get(agent.agnosticMemory.selectedObject).evoked.size();i++){
					d=(clic_x-612)*(clic_x-612) + (clic_y - (448+15*i))*(clic_y - (448+15*i));
					if (d<dmin){
						dmin=d;
						selectedObjectEvoked= i;
					}

				}
			}
		}
	}

	@Override
	public void mouseEntered(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mouseExited(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mousePressed(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mouseReleased(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}

	
}
