//2º trabalho de lab7 - Vitor
//tabalho de Simulação produtor e consumidor
//estrutura: fila
//Paulo Henrique 9816695
import java.awt.*;
import java.io.*;
import java.util.*;
import java.awt.event.*;
class Simulacao extends Frame implements ActionListener
{
 TextArea text_status = new TextArea(10,30);//status
 TextArea text_statusf = new TextArea(2,80);//status da fila
 Label lb_relo = new Label("00:00:00");
 TextField txt_tamanho = new TextField(10);
 TextField txt_tempo_prod = new TextField(10);
 TextField txt_tempo_cons = new TextField(10);
 TextField txt_tempo_control = new TextField(10);
 TextField txt_task = new TextField(10);
 Fila fila;
 Relogio relogio;
 Produtor produtor;
 Consumidor consumidor;
 Controlador controlador;
 Thread control;
 Tela01 perguntas;
 int el,tamanh,tempo_p,tempo_c,tempo_control,o,u;
 float tempo,tf;
 String nome_task,work;

 Simulacao()
 {
  setSize(800,600);
  setTitle("Principal");
  Button bt_sair = new Button("SAIR");
  Panel p1 = new Panel(new BorderLayout());//principal
  Panel p2 = new Panel(new FlowLayout());//produtor
  Panel p3 = new Panel(new FlowLayout());//consumidor
  Panel p4 = new Panel(new FlowLayout());
  Panel p41 = new Panel(new BorderLayout());//status e botoes
  Panel p5_41 = new Panel(new GridLayout(2,1));//relogio
  Panel p6 = new Panel(new FlowLayout());//status da fila
  Panel p7 = new Panel(new FlowLayout());//status da fila
  bt_sair.addActionListener(this);
  p41.add(text_status);
  p4.add("Center",p41);
  p5_41.add(bt_sair);
  p5_41.add(lb_relo);
  p7.add(text_statusf);
  p6.add(p7,"North");
  p4.add("East",p5_41);
  p1.add(p7);
  p1.add("South",p4);
  add(p1);
  lb_relo.setText("00:00:00");
  setVisible(true);
  perguntas = new Tela01(this);
  tamanh=perguntas.tamanho();
 }
 public void actionPerformed(ActionEvent evt)
  {
   String arg = evt.getActionCommand();
   System.out.println("Simulacao - press: " + arg);
      	        if(arg.equals("SAIR"))
				{//tempo = tempo de vida do vetor
				 para(3);
			    }
 }
 void rel()
 {
  tempo=fila.Soma();
 //tempo médio de permanencia...
  u=fila.Under();
  o=fila.Over();
  work=relogio.devolveHora();
  tf= fila.tamanho_medio();
 //tempo médio da fila
  el=fila.Elem();
  Estat est = new Estat(el,tf,tempo,work,o,u);//mostrar estatisticas
 }
 void inicia()
 {
  relogio = new Relogio(this);
  relogio.start();
  tamanh=perguntas.tamanho();
  tempo_p=perguntas.tempo_prod();
  tempo_c=perguntas.tempo_cons();
  tempo_control=perguntas.tempo_control();
  nome_task=perguntas.nome();
  fila = new Fila(this,relogio,tamanh,nome_task);
  controlador = new Controlador(this,tempo_control);
  control = new Thread(controlador);
  produtor = new Produtor(controlador,fila,tempo_p);
  consumidor = new Consumidor(controlador,fila,tempo_c);
  System.out.println("tam= "+ tamanh);
  System.out.println("tp= "+ tempo_p);
  System.out.println("tc= "+ tempo_c);
  System.out.println("control= "+ tempo_control);
  System.out.println("nome= "+ nome_task);
  control.start();
  consumidor.start();
  produtor.start();
 }
 public static void main (String args[])
 {
  Simulacao simulacao = new Simulacao();
 }
 void atualiza_rel(int h, int m, int seg)
 {
  String tempo,ho,mi,segu;
  ho = Integer.toString(h);
  mi = Integer.toString(m);
  segu = Integer.toString(seg);
  tempo = ho + ":" + mi + ":" + segu;
  lb_relo.setText(tempo);
 }
 void atualiza_status(String m)
 {
  text_status.append(m + "\n");
  //text_status.setText();//dúvida - ver se está certo
 }
 void atualiza_statusf(String m)
 {
  text_statusf.append(m + " ");
 }
 void limpa()
 {
  text_statusf.setText(" ");
 }

 void para(int op)
 {
     try
     {
        switch(op)
        {
		 case 1:
		        {
				 String mens2="CONSUMIDOR ENCERRADO";
				 System.out.println(mens2);
				 controlador.segue(false);
				 atualiza_status(mens2);
		         consumidor.segue(false);
			    }
			    break;
		 case 2:
			   {
				String mens2="PRODUTOR ENCERRADO";
				System.out.println(mens2);
	            atualiza_status(mens2);
	            controlador.segue2(false);
				produtor.segue(false);
			   }
			   break;
		 case 3:
			   {
				String mens2="CONTROLADOR ENCERRADO";
				System.out.println(mens2);
				controlador.segue(false);
				controlador.segue2(false);
				mens2="PRODUTOR ENCERRADO";
				System.out.println(mens2);
				atualiza_status(mens2);
				produtor.segue(false);
				mens2="CONSUMIDOR ENCERRADO";
				System.out.println(mens2);
				atualiza_status(mens2);
		        consumidor.segue(false);
		        rel();
			   }
			   break;
		}
	 }
	 catch(Exception e)
     {
      Aviso2 av = new Aviso2("Erro no matar");
	 }
 }
}
class Controlador extends Frame implements ActionListener,Runnable
{
 Simulacao s;
 int tempo;
 boolean v,f;
 Controlador(Simulacao s,int t)
 {
  this.s = s;
  v=f=true;
  tempo = t;
  Label lb_control = new Label("Deseja Continuar?");
  Label lb_nada = new Label(" ");
  Button bt_encerra_prod = new Button("ENCERRAR PRODUTOR");//produtor
  Button bt_encerra_cons = new Button("ENCERRAR CONSUMIDOR");//consumidor
  Button bt_encerra_ambos = new Button("ENCERRAR AMBOS");
  Button bt_ok = new Button("SIM");
  Button bt_cancel = new Button("NÃO");
  bt_encerra_prod.addActionListener(this);
  bt_encerra_cons.addActionListener(this);
  bt_encerra_ambos.addActionListener(this);
  Panel p0 = new Panel(new FlowLayout());
  Panel p1 = new Panel(new GridLayout(3,2));
  setTitle("CONTROLE");
  setBounds(250,150,350,250);//x,y,largura,altura
  p0.add(lb_control,"North");
  p1.add(bt_ok);//1,1
  p1.add(bt_cancel);//1,2
  p1.add(bt_encerra_cons);//2,1
  p1.add(bt_encerra_prod);//2,2
  p1.add(bt_encerra_ambos);//3,1
  p1.add(lb_nada);//3,2
  p0.add(p1,"Center");
  add(p0);
  bt_ok.addActionListener(this);
  bt_cancel.addActionListener(this);
 }
 public void run()
 {
    while(v || f)
	{
	   try
       {
	    Thread.sleep(tempo);
	    setVisible(true);
	    System.out.println("estou no thread controlador e v= " + v + " f= " + f);
       }
	   catch (InterruptedException e)
	   {
	    Aviso2 av = new Aviso2("Crontrolador não dormiu");
	   }
    }
  s.rel();
 }
 void segue(boolean go)
 {
  System.out.println("matei o controlador " + go);
  v=go;
 }
 void segue2(boolean go)
 {
  System.out.println("matei o controlador " + go);
  f=go;
 }
 public void actionPerformed(ActionEvent evt)
 {
  String arg = evt.getActionCommand();
  System.out.println("Controle - press: " + arg);
     if(arg.equals("SIM"))
     {
	  this.setVisible(false);
     }
        if(arg.equals("NÃO"))
        {
		 s.para(3);//controlador
		 System.out.println("foi para o matar controlador");
		 this.setVisible(false);
		}
		   if(arg.equals("ENCERRAR PRODUTOR"))
		   {
			s.para(2);//produtor
			this.setVisible(false);
		   }
		      if(arg.equals("ENCERRAR CONSUMIDOR"))
			  {
			   s.para(1);//consumidor
			   this.setVisible(false);
			  }
		         if(arg.equals("ENCERRAR AMBOS"))
				 {
				  s.para(3);//ambos
				  this.setVisible(false);
				 }
 }
}
class Produtor extends Thread
{
 Fila fila;
 int tempo_prod;
 boolean vai;
 Controlador d;
 Produtor(Controlador d,Fila fila,int t_p)
 {
  this.fila = fila;
  vai=true;
  tempo_prod = t_p;
 }
 void segue(boolean go)
 {
  vai = go;
  System.out.println("matei o produtor: " + vai);
 }
 public void run()
 {
   while(vai)
   {
//	System.out.println("PRODUTOR - SEGUE:  " + vai);
	   try
	   {
	    Thread.sleep(tempo_prod);
	    fila.inserir();
	   }
	   catch (InterruptedException e)
	   {
	    Aviso2 av = new Aviso2("Produtor não dormiu");
	   }
   }
 }
}
class Consumidor extends Thread
{
 Fila fila;
 int temp;
 boolean cont;
 Controlador d;
 Consumidor(Controlador d,Fila fila,int t)
 {
  this.fila = fila;
  cont = true;
  temp = t;
 }
 public void run()
 {
   while(cont)
   {
	   try
	   {
	 	Thread.sleep(temp);
	 	fila.remover();
	   }
	  catch (InterruptedException e)
	  {
	   Aviso2 av = new Aviso2("Consumidor não dormiu");
	  }
   }
 }
 void segue(boolean go)
 {
  System.out.println("matei o consumidor " + go);
  cont=go;
 }
}
