
package presentacion;

import encapsuladores.Idioma;
import encapsuladores.LineaFactura;
import excepciones.GenericaExcepcion;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.List;
import negocio.Factura;
import negocio.Idiomas;
import org.jdom2.JDOMException;

public class Menu {
         //   Ubicamos las siguientes referencias a objetos como atributos de Menu, pero en una 
         //   aplicación web, que sería el contexto productivo real en que se implementaría
         //   la funcionalidad de idiomas, estarían accesibles a todos los componentes de
         //   la capa de presentación, almacenados en atributos de ámbito session.
         private List<Idioma> listaIdiomas;
         private String[] opcionesDeMenu; 
         private String[] mensajesDeIntroduccion; 
         private String[] mensajesDeError;          
         private String idioma = "1"; // Se establece por defecto el idioma 1
         
    public void ejecutarMenu()
    {
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
        
        try {
           listaIdiomas = new Idiomas().getListaIdiomas();
           int[] numerosCadenas = getNumeroCadenas(); 
           opcionesDeMenu         = new String[numerosCadenas[0]];
           mensajesDeIntroduccion = new String[numerosCadenas[1]];
           mensajesDeError        = new String[numerosCadenas[2]];
           Object[] aglutinaArraysCadenas = {opcionesDeMenu, mensajesDeIntroduccion, mensajesDeError};
           // String[][] aglutinaArraysCadenas = {opcionesDeMenu, mensajesDeIntroduccion, mensajesDeError};
           // También se podian haber aglutinado como String[][], hubiese sido esta una solucion mas especifica.
           // Pero Object[] permite mayor versatilidad en la medida tuviesemos que aglutinar tambien otros
           // datos que no fuesen String[], y actuar de forma generica.
           cargarCadenasIdiomas(aglutinaArraysCadenas);
           
           byte opcion;
           
           do {
                for (int i = 0; i<opcionesDeMenu.length; i++){
                    System.out.println(opcionesDeMenu[i]);
                }
                System.out.print(mensajesDeIntroduccion[0]);
                opcion = (byte)Integer.parseInt(bufferedReader.readLine());    
                
                switch(opcion){
                    case 1: cambiarIdioma(aglutinaArraysCadenas);
                            break;
                    case 2: calcularImporteCompra();
                            break;                                                       
                }
                 
           } while (opcion != 3);
           
        } catch (GenericaExcepcion genericaExcepcion){
              switch (genericaExcepcion.getCodigoError()){
                  case -10: System.out.println(mensajesDeError[0]);        
                            break;
                  case -11: System.out.println(mensajesDeError[1]);        
                            break;
              }
        }
          catch (Exception exception){
              System.out.println(exception.getMessage());       
        }
    }
    
    private int[] getNumeroCadenas() throws GenericaExcepcion, JDOMException, IOException{
        
        return new Idiomas().getNumeroCadenas();
    }
    
    private void cargarCadenasIdiomas(Object[] aglutinaArraysCadenas) throws GenericaExcepcion, JDOMException, IOException{
        new Idiomas().leerCadenas(idioma, aglutinaArraysCadenas);
    }
  
    private void  cambiarIdioma(Object[] aglutinaArraysCadenas) throws IOException, GenericaExcepcion, JDOMException{      
        
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
        String nuevoIdioma;
        do {
             System.out.print(mensajesDeIntroduccion[1]);
             System.out.print("(");
             for (int i=0; i<listaIdiomas.size(); i++) {
                 Idioma idioma = listaIdiomas.get(i);
                 if (i > 0)
                     System.out.print(" / ");
                 System.out.print(idioma.getNumero()+" "+idioma.getNombre());
             }
             System.out.print(") : ");
        
             nuevoIdioma = bufferedReader.readLine();   
        } while (Integer.parseInt(nuevoIdioma) < 1  ||  Integer.parseInt(nuevoIdioma) > listaIdiomas.size());
        
        if (nuevoIdioma.compareTo(idioma) != 0){
            idioma = nuevoIdioma;
            cargarCadenasIdiomas(aglutinaArraysCadenas);
        }
    }  
    
    private void  calcularImporteCompra() throws IOException, GenericaExcepcion{  
        
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
        LineaFactura lineaFactura = new LineaFactura();
        
        System.out.print(mensajesDeIntroduccion[2]);
        lineaFactura.setPrecioUnitario(Double.parseDouble(bufferedReader.readLine()));        
        System.out.print(mensajesDeIntroduccion[3]);
        lineaFactura.setUnidades(Byte.parseByte(bufferedReader.readLine()));  
        
        new Factura().filtrarDatos(lineaFactura);
        
        System.out.println(mensajesDeIntroduccion[4]+lineaFactura.getPrecioFinal());
    }      
}
