
package presentacion;

import encapsuladores.MeteorologiaMunicipio;
import java.awt.Color;
import java.awt.EventQueue;
import java.util.List;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import negocio.InformacionGeografica;
import negocio.PrediccionMeteorologica;

public class InterfazPrediccion extends JFrame {
   
      private Controller controller;
      private JTree jTree;
      private DefaultTreeModel modelo;
      private DefaultMutableTreeNode nodoRaiz, nodoProductor, nodoPrediccionSemanal, nodoPrediccionDiaria, nodoProbabilidadPrecipitacion, nodoPeriodoProbabilidadPrecipitacion, nodoEstadoCielo, nodoPeriodoEstadoCielo, nodoTemperatura, nodoHumedadRelativa;
      private JLabel jLabelSeleccionProvincia;
      private JComboBox jComboBoxSeleccionProvincia;
      private JLabel jLabelSeleccionMunicipio;
      private JComboBox jComboBoxSeleccionMunicipio; 
      private JLabel jLabelAEMET;
      
    public InterfazPrediccion() {
        
        controller = new Controller(this);
        
        setSize(1200,900);
        setTitle("Predicción meteorológica");
        ubicarComponentes();     
        setVisible(true);                                                              
    }
    

    private void ubicarComponentes() {
        setLayout(null);               
        addWindowListener(controller);        // REGISTRO DE ESCUCHA DE EVENTOS DE VENTANA
        
        nodoRaiz = new DefaultMutableTreeNode(" ");
        jTree = new JTree( nodoRaiz );
        modelo = (DefaultTreeModel)jTree.getModel();           
        JScrollPane jScrollPane = new JScrollPane(jTree);
        jScrollPane.setBounds(20, 20, 1140, 450);
        add(jScrollPane); 
        
        jLabelSeleccionProvincia = new JLabel("PROVINCIA :");
        jLabelSeleccionProvincia.setBounds(80, 500, 120, 20);
        add(jLabelSeleccionProvincia);
        
        jComboBoxSeleccionProvincia = new JComboBox();
        jComboBoxSeleccionProvincia.setBounds(210, 500, 370, 20);
        jComboBoxSeleccionProvincia.setBackground(Color.white);
        jComboBoxSeleccionProvincia.setActionCommand("comboProvincias");
        add(jComboBoxSeleccionProvincia);
      
        
        jLabelSeleccionMunicipio = new JLabel("MUNICIPIO :");
        jLabelSeleccionMunicipio.setBounds(80, 670, 120, 20);
        add(jLabelSeleccionMunicipio);
        
        jComboBoxSeleccionMunicipio = new JComboBox();
        jComboBoxSeleccionMunicipio.setBounds(210, 670, 370, 20);
        jComboBoxSeleccionMunicipio.setBackground(Color.white);
        jComboBoxSeleccionMunicipio.setActionCommand("comboMunicipios");
        add(jComboBoxSeleccionMunicipio);       
        
        jLabelAEMET = new JLabel("© AEMET");
        jLabelAEMET.setBounds(900, 500, 100, 20);
        add(jLabelAEMET);
        //   LANZAMIENTO EXPLICITO EVENTO CARGA JComboBox jComboBoxSeleccionProvincia
        InvocacionCargaProvincias invocacionCargaProvincias = new InvocacionCargaProvincias();  
        invocacionCargaProvincias.addEventoCargaProvinciasListener(controller);
        invocacionCargaProvincias.fireEventoCargaProvincias("cargarProvincias");
    }    
    
    
    public void responderAController(String actionCommand) throws Exception {
        
        switch(actionCommand)
        {     
            case "cargarProvincias" :
                   //   La eliminación de registros en clases escucha permite que no se dispare el correspondiente 
                   //   evento para cada uno de los items que se añaden al JComboBox.
                   //   Esta actuación no es necesaria para el JComboBox correspondiente a la selección de provincia
                   //   porque solamente se carga en una sola ocasión. Se implementa testimonialmente.
                   if (jComboBoxSeleccionProvincia.getActionListeners().length  > 0)        
                       jComboBoxSeleccionProvincia.removeActionListener(controller);
                   
                   List<String> listaProvincias = new InformacionGeografica().leerProvincias();  
                   for (int i=0; i<listaProvincias.size(); i++)
                   {
                      jComboBoxSeleccionProvincia.addItem(listaProvincias.get(i));
                   }
                   
                   jComboBoxSeleccionProvincia.addActionListener(controller);                   
                   break;    
            case "comboProvincias":
                   if (jComboBoxSeleccionMunicipio.getActionListeners().length  > 0)        
                       jComboBoxSeleccionMunicipio.removeActionListener(controller); 
                   
                   jComboBoxSeleccionMunicipio.removeAllItems();
                   
                   List<String> listaMunicipios = new InformacionGeografica().leerMunicipios(jComboBoxSeleccionProvincia.getSelectedItem().toString().substring(0, 2));  
                   for (int i=0; i<listaMunicipios.size(); i++)
                   {
                      jComboBoxSeleccionMunicipio.addItem(listaMunicipios.get(i));
                   }
                   
                   jComboBoxSeleccionMunicipio.addActionListener(controller);                   
                   break;
            case "comboMunicipios":
                    cargarArbol(new PrediccionMeteorologica().obtenerPrediccionMeteorologica(jComboBoxSeleccionMunicipio.getSelectedItem().toString().substring(0, 5)));  
                   break;
        }           
    }  
     

    private void cargarArbol(MeteorologiaMunicipio meteorologiaMunicipio) {
        
        nodoRaiz.removeAllChildren();
        nodoRaiz.setUserObject("Predicción municipio :   "+meteorologiaMunicipio.getNombreMunicipio());
        modelo.reload();
        nodoProductor = new DefaultMutableTreeNode("Productor : "+meteorologiaMunicipio.getProductor());
        nodoRaiz.add(nodoProductor);
        nodoPrediccionSemanal = new DefaultMutableTreeNode("Predicción semanal");
        nodoRaiz.add(nodoPrediccionSemanal);
        
        for (int i=0; i<meteorologiaMunicipio.getMeteorologiaDiaria().length; i++)
        {
           if (meteorologiaMunicipio.getMeteorologiaDiaria(i) != null)
           {  
              nodoPrediccionDiaria = new DefaultMutableTreeNode( meteorologiaMunicipio.getMeteorologiaDiaria(i).getFecha().substring(8, 10) +"-"+
                                                                 meteorologiaMunicipio.getMeteorologiaDiaria(i).getFecha().substring(5, 7) +"-"+
                                                                 meteorologiaMunicipio.getMeteorologiaDiaria(i).getFecha().substring(0, 4)
                                                               );
              nodoPrediccionSemanal.add(nodoPrediccionDiaria);
              //      PROBABILIDAD DE PRECIPITACION
              nodoProbabilidadPrecipitacion = new DefaultMutableTreeNode("Probabilidad precipitación");
              for (int j=0; j<meteorologiaMunicipio.getPeriodo().length; j++)
               {
                  if (meteorologiaMunicipio.getMeteorologiaDiaria(i).getProbabilidadPrecipitacion(j) != null)
                  {
                      nodoPeriodoProbabilidadPrecipitacion = new DefaultMutableTreeNode(meteorologiaMunicipio.getPeriodo(j)+"          "+meteorologiaMunicipio.getMeteorologiaDiaria(i).getProbabilidadPrecipitacion(j));
                      nodoProbabilidadPrecipitacion.add(nodoPeriodoProbabilidadPrecipitacion);
                  }
               }
               nodoPrediccionDiaria.add(nodoProbabilidadPrecipitacion);
               //      ESTADO DEL CIELO
              nodoEstadoCielo = new DefaultMutableTreeNode("Estado del cielo");
              for (int k=0; k<meteorologiaMunicipio.getPeriodo().length; k++)
               {
                  if (meteorologiaMunicipio.getMeteorologiaDiaria(i).getEstadoCielo(k) != null)
                  {
                      nodoPeriodoEstadoCielo = new DefaultMutableTreeNode(meteorologiaMunicipio.getPeriodo(k)+"          "+meteorologiaMunicipio.getMeteorologiaDiaria(i).getEstadoCielo(k));
                      nodoEstadoCielo.add(nodoPeriodoEstadoCielo);
                  }
               }
               nodoPrediccionDiaria.add(nodoEstadoCielo);               
               //      TEMPERATURA
               nodoTemperatura = new DefaultMutableTreeNode("Temperatura");
               nodoTemperatura.add(new DefaultMutableTreeNode("Máxima : "+meteorologiaMunicipio.getMeteorologiaDiaria(i).getTemperaturaMaxima()));
               nodoTemperatura.add(new DefaultMutableTreeNode("Mínima : "+meteorologiaMunicipio.getMeteorologiaDiaria(i).getTemperaturaMinima()));
               nodoPrediccionDiaria.add(nodoTemperatura); 
               //      HUMEDAD RELATIVA
               nodoHumedadRelativa = new DefaultMutableTreeNode("Humedad Relativa");
               nodoHumedadRelativa.add(new DefaultMutableTreeNode("Máxima : "+meteorologiaMunicipio.getMeteorologiaDiaria(i).getHumedadRelativaMaxima()));
               nodoHumedadRelativa.add(new DefaultMutableTreeNode("Mínima : "+meteorologiaMunicipio.getMeteorologiaDiaria(i).getHumedadRelativaMinima()));
               nodoPrediccionDiaria.add(nodoHumedadRelativa);             
           }
        }        
    }


    
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
              @Override
              public void run() {         
                 new InterfazPrediccion();
              }
           });          
    }           
}
