/*
 * Interface.java
 *
 * Created on 8 of February 2006, 2:04
 */
/**
 *
 * @author  Eng. Paulo Roque Silva
 */
import java.awt.*;
import javax.imageio.ImageIO;
import javax.swing.*;
import java.io.File;
import java.io.IOException;

public class Interface extends JPanel {
    
    public static final long    serialVersionUID = 10072010L; // Interface Version
    static final int	MaxDisplay = 302;           // maximum neurons to be displayed = #neurons C. elegans
    Liberu      		liberu;						// pointer for Liberu
    boolean     		execute;					// if displays Liberu data
    Image       		imgWorld, imgE, imgElegans2, imgElegans3, imgElegans4,
    					imgElegans2n, imgElegans3n, imgElegans4n,
    					imgElegans2w, imgElegans3w, imgElegans4w,
    					imgElegans2e, imgElegans3e, imgElegans4e;
    Font        		fontDefault, sansBold14;
    Color       		colorBefore;
    int         		[]value = new int[100];     // # depend of #values to view - set to 60
    int         		i, n;                       // indexes
    int         		points;                     // sum Belo

    /** Creates new form Interface */
    public Interface() {

        execute = false;
        points  = 0;
//        setLayout(new BorderLayout());
        try {
            imgWorld    = ImageIO.read(new File("World.jpg"));       // simple maze
            imgElegans2 = ImageIO.read(new File("c_elegans2.jpg"));  // C. elegans and earth
            imgElegans3 = ImageIO.read(new File("c_elegans3.jpg"));  // C. elegans and food
            imgElegans4 = ImageIO.read(new File("c_elegans4.jpg"));  // C. elegans and water
            imgElegans2n = ImageIO.read(new File("c_elegans2n.jpg"));  // C. elegans and earth
            imgElegans3n = ImageIO.read(new File("c_elegans3n.jpg"));  // C. elegans and food
            imgElegans4n = ImageIO.read(new File("c_elegans4n.jpg"));  // C. elegans and water
            imgElegans2w = ImageIO.read(new File("c_elegans2w.jpg"));  // C. elegans and earth
            imgElegans3w = ImageIO.read(new File("c_elegans3w.jpg"));  // C. elegans and food
            imgElegans4w = ImageIO.read(new File("c_elegans4w.jpg"));  // C. elegans and water
            imgElegans2e = ImageIO.read(new File("c_elegans2e.jpg"));  // C. elegans and earth
            imgElegans3e = ImageIO.read(new File("c_elegans3e.jpg"));  // C. elegans and food
            imgElegans4e = ImageIO.read(new File("c_elegans4e.jpg"));  // C. elegans and water
        }
        catch (IOException ex) {
            ex.printStackTrace();
        }
        for (i=0; i<value.length; i++)
            value[i] = 0;
    }
    
    public void displayRobot(Liberu lib, boolean ex) {
        
        liberu = lib;
        execute = ex;
    }
    
    public void saveValue(int n, int val) {
        
        value[n] = val;
    }

    public void paintComponent(Graphics g) {
    	int n, m, p; //index
       
        super.paintComponent(g);
       
        g.drawImage(imgWorld, 50, 100, null);
        sansBold14 = new Font("SansSerif", Font.BOLD, 14);
        fontDefault = g.getFont();
        g.setFont(sansBold14);
        g.drawString("World", 115, 90);
        if (value[6] == 1 || value[7] == 1)               								// value 6
            points += value[16];
//      else
//      	points += 1;
        if (!execute)
        	points = 0;
        g.drawString(Integer.toString(points), 170, 90);			// value 16 sum
        g.setFont(fontDefault);
        colorBefore = g.getColor();

        imgE = imgElegans2;
    	if (value[4] == World.NORTH) imgE = imgElegans2n;
    	if (value[4] == World.WEST) imgE = imgElegans2w;
    	if (value[4] == World.EAST) imgE = imgElegans2e;
        if (value[0] == 3) {
        	imgE = imgElegans3;             				// value 0
        	if (value[4] == World.NORTH) imgE = imgElegans3n;
        	if (value[4] == World.WEST) imgE = imgElegans3w;
        	if (value[4] == World.EAST) imgE = imgElegans3e;
        }
        if (value[0] == 4) {
        	imgE = imgElegans4;
        	if (value[4] == World.NORTH) imgE = imgElegans4n;
        	if (value[4] == World.WEST) imgE = imgElegans4w;
        	if (value[4] == World.EAST) imgE = imgElegans4e;
        }
        if (value[0] != 0) g.drawImage(imgE, 65 + 60 * ((value[0]-1) % 3),
                         115 + 60 * ((value[0]-1) / 3),
                          null);
        g.drawString("Smell   = ", 65, 330);
        g.drawString(Integer.toString(value[0]), 150, 330);             // value 0
        g.drawString("Tact     = ", 65, 370);
        if (value[1] == Liberu.TACT)      								// value 1
        	g.drawString("Wall", 150, 370);
        else
            g.drawString("No Wall", 150, 370);
        g.drawString("Taste   = ", 65, 310);
//        g.drawString(Integer.toString(value[2]), 150, 310);             // value 2         NXT
        switch (value[2]) {               								// value 2         Elegans
            case World.EARTH: g.drawString("Earth", 150, 310);
                break;
            case World.WATER: g.drawString("Water", 150, 310);
                break;
            case World.FOOD: g.drawString("Food", 150, 310);
                break;
            default: g.drawString("Error", 150, 310);
                break;
        }
        g.drawString("Step= ", 65, 30);
        g.drawString(Integer.toString(value[3]), 150, 30);              // value 3
        if (value[3] <= RunEmotionalUnit.ActRandom)
            g.drawString("Utero", 180, 30);              // value 3
        g.drawString("Orientation= ", 65, 410);
        switch (value[4]) {               								// value 4
            case World.NORTH: g.drawString("North", 150, 410);
                break;
            case World.EAST: g.drawString("East", 150, 410);
                break;
            case World.SOUTH: g.drawString("South", 150, 410);
                break;
            case World.WEST: g.drawString("West", 150, 410);
                break;
            default: g.drawString("Error", 150, 410);
                break;
        }
        g.drawString("Vision  = ", 65, 350);
        if (value[5] == World.WALL)               						// value 5         Elegans
            g.drawString("Wall", 150, 350);												// Elegans
        else																			// Elegans
            g.drawString(Integer.toString(value[5]), 150, 350);							// Elegans
//    	for (n=0; n<Liberu.NanalogVision; n++)											// NXT
//            g.drawString(Integer.toString(value[50+n]), 150+n*30+10*(n/3), 350);		// NXT
        
        g.drawString("Sound  = ", 65, 390);
        for (n=0; n < PlayLiberu.BANDS; n++)
            g.drawString(Integer.toString(value[36+n]), 150+n*35, 390);             // value 36+BANDS

        g.drawString("Thirsty = ", 65, 450);
        if (value[6] == 1) {               								// value 6
            g.setColor(Color.BLUE);
            g.drawString("Yes", 150, 450);
        	g.setColor(colorBefore);
        }
        else
            g.drawString("No", 150, 450);
        g.drawString("Hungry  = ", 200, 450);
        if (value[7] == 1) {               								// value 7
            g.setColor(Color.GREEN);
            g.drawString("Yes", 285, 450);
            g.setColor(colorBefore);
        }
        else
            g.drawString("No", 285, 450);
        
        g.drawString("Action  = ", 65, 470);
        if (value[35] == 1)               								// value 35
            g.setColor(Color.RED);
        if (value[35] == 2)               								// value 35
            g.setColor(Color.GREEN);
        if (value[8] == 1)               								// value 8
            g.drawString("Drink", 150, 470);
        if (value[9] == 1)               								// value 9
            g.drawString("Eat", 200, 470);
//        if (value[9] == 1)               								// value 9
//            g.drawString("NLeft", 200, 470);
        if (value[10] == 1)               								// value 10
            g.drawString("Walk", 250, 470);
        if (value[11] == 1)               								// value 11
            g.drawString("Turn Left", 300, 470);
        if (value[12] == 1)               								// value 12
            g.drawString("Turn Right", 380, 470);
        if (value[13] == 1)               								// value 12
            g.drawString("Crying", 460, 470);
// ##############################################################################
        if (value[23] == 1)               								// value 23
            g.drawString("Pain", 480, 470);
        if (value[24] == 1)               								// value 24
            g.drawString("New", 520, 470);
        if (value[25] == 1)               								// value 25
            g.drawString("Happy", 560, 470);
        if (value[26] == 1)               								// value 26
            g.drawString("Sad", 610, 470);
        if (value[27] == 1)               								// value 27
            g.drawString("MDrink", 660, 470);
        if (value[28] == 1)               								// value 28
            g.drawString("MEat", 720, 470);
//        if (value[13] == 1)               								// value 13
//            g.drawString("NRight", 460, 470);
        g.setColor(colorBefore);
        
        g.drawString("Emotion= ", 65, 490);
        if (value[14] == 1) {              								// value 14
        	g.setColor(Color.RED);
            g.drawString("Dor", 150, 490);
        	g.setColor(colorBefore);
        }
        if (value[15] == 1)               								// value 15
            g.drawString("New", 200, 490);
        g.drawString("Belo=", 250, 490);
        g.drawString(Integer.toString(value[16]), 300, 490);			// value 16
        if (value[18] == 1)               								// value 18
            g.drawString("Happy", 350, 490);
        if (value[19] == 1)               								// value 19
            g.drawString("Sad", 400, 490);
        if (value[20] == 1)               								// value 20
            g.drawString("Ansia", 450, 490);
        g.drawString("State= ", 65, 60);
        if (value[21] == 1)               								// value 21
            g.drawString("Dormindo", 150, 60);
        else
            g.drawString("Acordado", 150, 60);
        if (value[22] == 1)               								// value 22
            g.drawString("Chorando", 150, 75);
        else
            g.drawString("         ", 150, 75);
        
        if (execute) {
            g.drawString("Ta", 270, 30);
            g.drawString("Sm", 270, 70);
            g.drawString("Vi", 270, 110);
            g.drawString("Tc", 270, 150);
            g.drawString("So", 270, 190);
            g.drawString("PS", 270, 230);
            g.drawLine(300, 30, 300, 30 + 40 * Liberu.NTRAIL);    	// Y axis
            g.drawLine(300, 30 + 40 * Liberu.NTRAIL, 300 + liberu.past.nNeuronsT,
            		   30 + 40 * Liberu.NTRAIL);  // X axis
            g.drawString("Fired neurons, by Past...", 300, 30 + 40 * Liberu.NTRAIL + 30);
            if (liberu.past.time[0][0].pointer > MaxDisplay)
            	p = MaxDisplay;
            else
            	p = liberu.past.time[0][0].pointer;
			g.drawLine(300 + p+1, 29, 300 + p+1, 30 + 40 * Liberu.NTRAIL - 1);        // pointer
            n = liberu.past.time[0][0].pointer - MaxDisplay;
            if (n < 0)
                n = 0;
            m = n;
            while (n < liberu.past.nNeuronsT && n < m + MaxDisplay) {
            	for (i=0; i < Liberu.NTRAIL; i++)
            		if (liberu.past.time[n][i].fire) 			// Neuron fires
            			g.drawLine(300 + n+1, 30 + 40 * i - 1, 300 + n+1, 30 + 40 * i - 1);
            	if (n % 10 == 0) g.drawLine(300 + n+1, 30 + 40 * Liberu.NTRAIL,
            				300 + n+1, 30 + 40 * Liberu.NTRAIL + 3); 	// X scale 10 fraction
            	n += 1;
            }
            g.setColor(Color.RED);
            g.drawString("Fired neurons, by Senses...", 300, 50 + 40 * Liberu.NTRAIL + 30);
            n = 0;
            while (n < liberu.past.nNeuronsPTaste && n < MaxDisplay) {
        		if (liberu.past.nodeTaste[n].fire) 			// Neuron fires
                    g.drawString("*", 300 + n+1, 50 - 1);
            	n += 1;
            }
            n = 0;
            while (n < liberu.past.nNeuronsPSmell && n < MaxDisplay) {
        		if (liberu.past.nodeSmell[n].fire) 			// Neuron fires
                    g.drawString("*", 300 + n+1, 50 + 40 - 1);
            	n += 1;
            }
            n = 0;
            while (n < liberu.past.nNeuronsPVision && n < MaxDisplay) {
        		if (liberu.past.nodeVision[n].fire) 			// Neuron fires
                    g.drawString("*", 300 + n+1, 50 + 40 * 2 - 1);
            	n += 1;
            }
            n = 0;
            while (n < liberu.past.nNeuronsPTact && n < MaxDisplay) {
        		if (liberu.past.nodeTact[n].fire) 			// Neuron fires
                    g.drawString("*", 300 + n+1, 50 + 40 * 3 - 1);
            	n += 1;
            }
            n = 0;
            while (n < liberu.past.nNeuronsPSound && n < MaxDisplay) {
        		if (liberu.past.nodeSound[n].fire) 			// Neuron fires
                    g.drawString("*", 300 + n+1, 50 + 40 * 4 - 1);
            	n += 1;
            }
            n = 0;
            while (n < liberu.past.nNeuronsPProSelf && n < MaxDisplay) {
        		if (liberu.past.nodeProSelf[n].fire) 			// Neuron fires
                    g.drawString("*", 300 + n+1, 50 + 40 * 5 - 1);
            	n += 1;
            }
            g.setColor(colorBefore);
        }
    }
}
