//package tarea_3;

import java.awt.*;
import java.awt.geom.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.imageio.*;
import java.io.*;
import java.awt.image.*;
import java.net.*;
import java.applet.*;

/**
 * Esta clase maneja la visualizacion de los graficos
 * @author Francisco Cabezas
 * @author Manuel Gallardo
 */

public class grafics extends Equipment{

    public grafics(Point _position, PlantView v, int id, Tank tank,Controller control){
		position = _position;
		controller = control;
		view = v;
		ide=id;
		receiver=tank;
		gui = new Box(BoxLayout.Y_AXIS);
		puntos_val = new Point[T_MAX];
		puntos_h = new Point[T_MAX];
		puntos_ref = new Point[T_MAX];
		tiempo = 0;
		try{ //Intenta cargar la imagen de la bocina
			
                    //File url = new File("trompeta.gif");     
                    URL url = getClass().getResource("trompeta.gif");
                    speaker = ImageIO.read(url);
		} 
		catch (IOException e){}
		try{ //Intenta cargar el sonido de la bocina

			URL sound = getClass().getResource("houston.wav");
			clip = java.applet.Applet.newAudioClip(sound);                     
           	}
		catch(Exception e){}
	}


	/** 
	 * El Metodo paint basicamente pinta el(los) grafico(s)  
	 * @param g2d	El Objeto grafico para pintar se invoca con el objetivo de repintar el dibujo
	 */
	public void paint(Graphics2D g2d){
            
		// Desde aca se dibujan los bordes.
		final int ANCHO=150;
		final int ALTO=150;
		int i;
		g2d.drawString("Estanque "+ide,position.x+ANCHO/2,position.y-ALTO-10);
		
                g2d.setColor(Color.black);g2d.drawLine(position.x,position.y,position.x+ANCHO,position.y);//creacion de eje X
		g2d.setColor(Color.blue); g2d.drawString("Tiempo",position.x+ANCHO,position.y+20); // tiempo
		g2d.setColor(Color.black);g2d.drawLine(position.x,position.y-ALTO,position.x,position.y);//creacion de eje Y
		g2d.setColor(Color.blue);g2d.drawString("Altura",position.x-30,position.y-ALTO); // altura
		g2d.setColor(Color.black);
		g2d.draw(new Rectangle2D.Double(position.x+ANCHO+5,position.y-2*ALTO/3,140,55));
                g2d.setColor(Color.blue);g2d.fill(new Rectangle2D.Double(position.x+ANCHO+10,position.y-ALTO/3-30,15,10));
		g2d.setColor(Color.black);g2d.drawString("Nivel "+ide,position.x+ANCHO+10+20,position.y-ALTO/3-35);
		g2d.setColor(Color.red);g2d.fill(new Rectangle2D.Double(position.x+ANCHO+10,position.y-ALTO/3-45,15,10));
		g2d.setColor(Color.black);g2d.drawString("Posicion Valvula "+ide,position.x+ANCHO+10+20,position.y-ALTO/3-20);
		g2d.setColor(Color.green);g2d.fill(new Rectangle2D.Double(position.x+ANCHO+10,position.y-ALTO/3-15,15,10));
		g2d.setColor(Color.black);g2d.drawString("Referencia ",position.x+ANCHO+10+20,position.y-ALTO/3-5);
			
		
		//Reinicio del buffer
		if(tiempo==T_MAX-1){ 
			tiempo=0;
			for(i=0;i<T_MAX;i++){
				puntos_val[i]=null;
				puntos_h[i]=null;
				puntos_ref[i]=null;
			}	
		}
		else tiempo++;
		
		// Establece la cantidad de puntos a dibujar
		puntos_val[tiempo]=new Point(position.x+tiempo,position.y-(int)(receiver.getOutValve()*100));
		puntos_h[tiempo]=new Point(position.x+tiempo,position.y-(int)(receiver.getLevel()));
		puntos_ref[tiempo]=new Point(position.x+tiempo,position.y-(int)controller.getRef());
		
                
       
		if (receiver.getLevel()==0&&ide==1){
			if((System.currentTimeMillis()/1000)%2==0){
				g2d.drawImage(speaker, null,position.x+200,position.y-ALTO-20);
				if(rep){
					rep=false;   
					clip.play(); // Reproduce el sonido
				}
			}
			else rep = true;             // Reset
			
		}
		
		//Une lineas para dibujar las variables del grafico
		for(i=0;i<T_MAX;i++){
			if(puntos_val[i]!=null){
				g2d.setColor(Color.blue);
				if(i!=0 && puntos_val[i-1]!=null)g2d.drawLine(puntos_val[i].x,puntos_val[i].y,puntos_val[i-1].x,puntos_val[i-1].y);
				g2d.setColor(Color.red);
				if(i!=0 && puntos_h[i-1]!=null)g2d.drawLine(puntos_h[i].x,puntos_h[i].y,puntos_h[i-1].x,puntos_h[i-1].y);
				//if(ref==true){
					g2d.setColor(Color.green);g2d.fillOval(puntos_ref[i].x,puntos_ref[i].y, 1, 1);
					if(i!=0 && puntos_ref[i-1]!=null)g2d.drawLine(puntos_ref[i].x,puntos_ref[i].y,puntos_ref[i-1].x,puntos_ref[i-1].y);	
				//}
			}
		}
		g2d.setColor(Color.black);	
	}

	/**
	 * Retorna el objeto Box con el dibujo  
	 * @return el <emp> gui</emp> con el dibujo del grafico
	 */
	public Box getGUI(){
		return gui;
	}

	/** 
	 * Cuando se invoca este metodo actualiza en forma sincronica el dibujo.  
	 * @param dt 	 Diferencial de tiempo en la simulacion
	 */
	public synchronized void timeTick(float dt){
		view.repaint();         
	}

	/**
	 * Stream del clip de sonido.
	 */
	private AudioClip clip;
	/**
	 * Controlador de la planta.
	 */
	private Controller controller;
	/**
	 * Identifica el no estanque.
	 */
	private int ide;
	/**
	 * Tiempo de paso de los puntos del grafico.
	 */
	private int tiempo;
	/**
	 * Tiempo maximo que se muestra el grafico.
	 */
	private final int T_MAX = 150;
	/**
	 * Arreglo de puntos para el grafico de la posicion de la valvula.
	 */
	private Point puntos_val[];
	/**
	 * Arreglo de puntos para el grafico de la altura.
	 */
	private Point puntos_h[];
	/**
	 * Arreglo de puntos para el grafico de la referencia.
	 */
	private Point puntos_ref[];
	/**
	 * Estanque al que se le graficaran las variables.
	 */
	private Tank receiver;
	/**
	 * Variable que entrega la posicion del grafico.
	 */
	private Point position;
	/**
	 * El Objeto Box que tiene el contenido del grafico.
	 */
	private Box gui;
	/**
	 * view deriva de la clase PlantView.
	 */
	private PlantView view;
	/**
	 * Invoca al Objeto imagen que contiene el icono de la bocina.
	 */
	private BufferedImage speaker;
	/**
	 * Es una variable interna que evita la repeticion del loop infinito del sonido.
	 */
	private boolean rep=true;

}

