
package filtrocuentabancaria;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.LinkedHashMap;
import java.util.Map;

public class Inicio {
    static Map<String, String> entidadesBancarias = new LinkedHashMap<String, String>();
    static Map<String, String> sucursalesBancarias = new LinkedHashMap<String, String>();
    
    public static void main(String[] args) {
               
        //  formato cuenta IBAN   ESIIEEEESSSSDCNNNNNNNNNN 
        //  ES -->> España
        //  II -->> dígitos de control IBAN
        //  EEEE -->> código de entidad bancaria
        //  SSSS -->> código de sucursal
        //  D -->> dígito control validación conjunto EEEESSSS
        //  C -->> dígito control validación número cuenta: NNNNNNNNNN
        //  NNNNNNNNNN -->> número de cuenta
        
        cargarEntidadesBancarias(entidadesBancarias);
        cargarSucursalesBancarias(sucursalesBancarias);  // cargaríamos solamente información sobre sucursales de la entidad bancaria seleccionada
        
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
        CuentaBancaria cuentaBancaria = null;
        String numeroCuentaBancaria = "";
        try {
              System.out.print("Introducir número cuenta Bancaria en formato IBAN (ESIIEEEESSSSDCNNNNNNNNNN) : ");
              numeroCuentaBancaria = bufferedReader.readLine();
              CuentaBancaria.filtroCuenta(numeroCuentaBancaria);
              cuentaBancaria = new CuentaBancaria();
              cuentaBancaria.setNumeroCuenta(numeroCuentaBancaria);
              System.out.println("Nombre de la entidad bancaria : "+cuentaBancaria.getNombreEntidadBancaria(entidadesBancarias));
              System.out.println("Dirección de la sucursal bancaria : "+cuentaBancaria.getSucursalBancaria(sucursalesBancarias));
        } catch (GenericaExcepcion excepcion)
        {
            String mensajeError = "";
            
            if (excepcion.getCodigoError() <= 2)
            {
                switch(excepcion.getCodigoError())
                {  case -1: mensajeError = "Longitud cuenta distinta a 24 dígitos";
                            break;
                   case 1:  mensajeError = "Debe estar la letra E en primera posición";
                            break;        
                   case 2:  mensajeError = "Debe estar la letra S en segunda posición";
                            break;                          
                }
                System.out.println(mensajeError);
            }
            else
            {
                if (excepcion.getCodigoError() >= 3  &&  excepcion.getCodigoError()<=24)
                {
                    mensajeError = "En la posición "+excepcion.getCodigoError()+" debe haber un dígito numérico";
                    System.out.println(mensajeError);
                }
                else
                {
                    int codigoErrorAcumulativo = excepcion.getCodigoError();
                    
                    int codigoError = 128;                   
                    while (codigoErrorAcumulativo > 0)
                    {
                        if ((codigoErrorAcumulativo - codigoError) >= 0)
                        {  switch (codigoError)
                           {  case 32  : mensajeError = "Error validación diígitos control IBAN";
                              break;
                              case 64  : mensajeError = "Error validación diígito control conjunto EEEESSSS";
                              break;                      
                              case 128 : mensajeError = "Error validación diígito control número cuenta NNNNNNNNNN";
                              break;                      
                            }
                
                           System.out.println(mensajeError);
                           codigoErrorAcumulativo -= codigoError;
                        }
                        codigoError /=2;
                    }    
/*
                    for (int codigoError = 128; codigoError >=32 ; codigoError /=2) {
                        if ((codigoErrorAcumulativo & codigoError) > 0)
                        {  switch (codigoError)
                           {  case 32  : mensajeError = "Error validación diígitos control IBAN";
                              break;
                              case 64  : mensajeError = "Error validación diígito control conjunto EEEESSSS";
                              break;                      
                              case 128 : mensajeError = "Error validación diígito control número cuenta NNNNNNNNNN";
                              break;                      
                            }
                
                           System.out.println(mensajeError);
                        }              
                    }
*/
                }
            }
        }
          catch (Exception excepcion)
        {
            System.out.println(excepcion.getMessage());
        }        
    }  
    
    private static void cargarEntidadesBancarias(Map<String, String> entidadesBancarias) {
        entidadesBancarias.put("0182", "BANCO BILBAO VIZCAYA ARGENTARIA");        
        entidadesBancarias.put("0075", "BANCO POPULAR ESPAÑOL"); 
        entidadesBancarias.put("0049", "BANCO SANTANDER"); 
        entidadesBancarias.put("2038", "BANKIA"); 
        entidadesBancarias.put("2085", "IBERCAJA BANCO");         
        // Se sugiere al lector que introduzca los elementos correspondientes a la entidad bancaria con la que crea oportuno realizar pruebas.
        // Podríamos haber generado esta colección de forma análoga a como se ha realizado para Provincias y Municipios en la 
        // aplicación PrediccionMeteorologicaXML, creando en primer lugar un XML con dicha información, para posteriormente cuando
        // se inicie la aplicación cargar el contenido del XML en el Map en memoria.
        // En pro de minimizar la extensión del código del programa, se ha optado por cargarlo mediante literales, sin descartar la 
        // posibilidad de que se podría implementar, para un contexto en producción, como se ha descrito. Para ello, el lector
        // debería aplicar los mecanismos utilizados en la citada aplicación.
    }

    private static void cargarSucursalesBancarias(Map<String, String> entidadesBancarias) {
        entidadesBancarias.put("0001", "DIRECCION DE SUCURSAL 1");        
        entidadesBancarias.put("0002", "DIRECCION DE SUCURSAL 2"); 
        entidadesBancarias.put("0003", "DIRECCION DE SUCURSAL 3"); 
        entidadesBancarias.put("0004", "DIRECCION DE SUCURSAL 4"); 
        entidadesBancarias.put("0005", "DIRECCION DE SUCURSAL 5");         
        // Se sugiere al lector que introduzca los elementos correspondientes a sucursales de la entidad bancaria con la que crea oportuno realizar pruebas.
        // Hacemos extensivo a datos sobre sucursales bancarias, todo lo especificado como comentario en el método cargarEntidadesBancarias en relación
        // a disponer de dichos datos en un repositorio en fichero XML, así deL procedimiento a aplicar para obtener dicha información para las sucursales
        // bancarias de todas las entidades.
    }
}
