package aec2.sistema;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.awt.List;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.util.Random;
import java.util.Scanner;
import aec2.excepciones.ExcepcionSexo;
import aec2.excepciones.ExcepcionCadena;
import aec2.excepciones.ExcepcionEntero;
import aec2.excepciones.ExcepcionEstadoCivil;
import aec2.excepciones.ExcepcionFecha;
import aec2.excepciones.ExcepcionMail;
import aec2.modelo.Estudiante;
import aec2.modelo.Sexo;
import aec2.modelo.EstadoCivil;
public class EstudiantesUdima implements Sistema {
// Atributos
String opcion;
private String rutaFichero;
private ArrayList<Estudiante> listEstudiantes = new ArrayList<Estudiante>();
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
// Constructor
public EstudiantesUdima(String rutaFichero) { this.rutaFichero = rutaFichero;
}
/**
* Metodo principal del sistema
*/
@Override
public void ejecutar() { String textoInicio = "Bienvenido al sistema de gestion de estudiantes de Udima.\n"
+ "Antes de comenzar, permitame cargar los datos almacenados en el fichero 'almacen-datos.txt'.\n";
System.out.println(textoInicio);
try { recuperarDeFichero();
System.out.println("El proceso de carga de datos ha concluido satisfactoriamente: " + listEstudiantes.size() + " estudiantes disponibles\n"); } catch (Exception ex) { System.out.println("El proceso de carga de datos ha tenido problemas y no ha concluido satisfactoriamente: El fichero 'fichero-inventado.txt' no ha podido ser encontrado"); }
int opcionMenu;
do { opcionMenu = opciones();
switch (opcionMenu) { case 1:
listaEstudiantes();
limpiarPantalla();
break;
case 2:
Estudiante estudiante = crearEstudiante();
if (estudiante != null) { listEstudiantes.add(estudiante);
System.out.println("El nuevo estudiante ha sido creado satisfactoriamente"); System.out.println(estudiante.toString());
} else { System.out.println("Se ha producido un error al crear el estudiante"); }
limpiarPantalla();
break;
case 3:
eliminarEstudiante();
limpiarPantalla();
break;
case 0:
salir();
break;
}
} while (opcionMenu != 0);
}
// Otros metodos (auxiliares -> privados)
/**
* Metodo con las opciones principales para el usuario
*/
private int opciones() { int opcion;
do { System.out.println("¿En que puedo ayudarle?"); System.out.println("(1) Me gustaria ver todos los estudiantes"); System.out.println("(2) Quisiera crear y anadir un nuevo estudiante al sistema"); System.out.println("(3) Desearia eliminar un estudiante del sistema"); System.out.println("(0) Salir"); System.out.println();
opcion = pedirEntero("Escriba la opcion que desee: \n"); } while (opcion < 0 && opcion > 3);
return opcion;
}
/**
* Metodo para crear un nuevo estudiante
*/
private Estudiante crearEstudiante() { Scanner teclado = new Scanner(System.in);
Estudiante estudiante = null;
try { System.out.println("Creando un nuevo estudiante.");
String nombre = pedirCadena("Introduzca el NOMBRE: "); String apellidos = pedirCadena("Introduzca los APELLIDOS: ");
try { System.out.print("Introduzca el EMAIL: "); String email = pedirEmail(teclado.nextLine());
if (email != null);
}catch(ExcepcionMail e) { System.out.println(e.getMessage());
}
boolean esValido = false;
Sexo s = null;
do { try { String sexo = pedirCadena("Introduzca el SEXO [HOMBRE, MUJER]: "); esValido = false;
if (sexo.equalsIgnoreCase("hombre")) { s = Sexo.HOMBRE;
esValido = true;
} else if (sexo.equalsIgnoreCase("mujer")) { s = Sexo.MUJER;
esValido = true;
} else { throw new ExcepcionSexo(sexo); // Lanzamos la excepcion
}
} catch (ExcepcionSexo ex) { System.out.println(ex.getMessage()); // Muestra por pantalla el mensaje incluido en la excepcion
}
} while (!esValido);
boolean esCorrecto = false;
EstadoCivil e = null;
do { try { String estadoCivil = pedirCadena("Introduzca el ESTADO CIVIL: [SOLTERO, CASADO, DIVORCIADO, VIUDO]: "); esCorrecto = false;
if (estadoCivil.equalsIgnoreCase("soltero")) { esCorrecto = true;
e = EstadoCivil.SOLTERO;
} else if (estadoCivil.equalsIgnoreCase("casado")) { esCorrecto = true;
e = EstadoCivil.CASADO;
} else if (estadoCivil.equalsIgnoreCase("divorciado")) { esCorrecto = true;
e = EstadoCivil.DIVORCIADO;
} else if (estadoCivil.equalsIgnoreCase("viudo")) { esCorrecto = true;
e = EstadoCivil.VIUDO;
} else { throw new ExcepcionEstadoCivil(estadoCivil); // Lanzamos la excepcion
}
} catch (ExcepcionEstadoCivil ex) { System.out.println(ex.getMessage()); // Muestra por pantalla el mensaje incluido en la excepcion
}
} while (!esCorrecto);
System.out.print("Introduzca la FECHA DE NACIMIENTO [formato DD/MM/YYYY]: "); Scanner scanner = new Scanner(System.in);
String input = scanner.nextLine();
SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy"); Calendar fechaNacimiento = Calendar.getInstance();
fechaNacimiento.setTime(sdf.parse(input));
estudiante = new Estudiante(crearIdentificador(), nombre, apellidos, pedirEmail(null), s, e, fechaNacimiento);
} catch (Exception ExcepcionFecha) { estudiante = null;
}
return estudiante;
}
/**
* Metodo que muestra la lista de estudiantes
*/
private void listaEstudiantes() { if (listEstudiantes != null && !listEstudiantes.isEmpty()) {
String[] cabeceras = new String[]{"ID", "NOMBRE", "APELLIDOS", "EMAIL", "SEXO", "EST-CIVIL", "FECHA-NAC", "EDAD", "CUMPLE", "FECHA-CREACION"};
System.out.println(":: Mostrando todos los estudiantes ..."); DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); SimpleDateFormat sdfNac = new SimpleDateFormat("yyyy/MM/dd"); Calendar cal = Calendar.getInstance();
System.out.println(":: Instante actual: " + dateFormat.format(cal.getTime())); System.out.println("Numero total de estudiantes (" + listEstudiantes.size() + ")\n");
System.out.format("%5s %-10s %-10s %-22s %-10s %-12s %-10s %10s %8s %-10s \n", cabeceras[0], cabeceras[1], cabeceras[2], cabeceras[3], cabeceras[4], cabeceras[5], cabeceras[6], cabeceras[7], cabeceras[8], cabeceras[9]); for (Estudiante e : listEstudiantes) { LocalDate fechaNacimiento;
LocalDate currentDate;
System.out.format("%5s %-10s %-10s %-22s %-10s %-12s %-10s %10s %8s %-10s \n", e.getIdentificadorFormateado(),
e.getNombre(),
e.getApellidos(),
e.getEmail(),
e.getSexo(),
e.getEstadoCivil(),
sdfNac.format(e.getFechaNacimiento().getTime()),
e.getEdad(),
e.getDiasCumpleanos(),
dateFormat.format(e.getFechaCreacion().getTime())
);
}
System.out.println("\n\n"); }
}
/**
* Metodo para eliminar un estudiante
*/
private void eliminarEstudiante() { if (listEstudiantes.isEmpty()) { System.out.println("No hay tareas para eliminarEstudiante"); } else { try { // Solicito identificador de tarea a eliminarEstudiante
System.out.println(":: Eliminando un estudiante del sistema ..."); System.out.print("Introduzca el IDENTIFICADOR de estudiante: "); opcion = bf.readLine();
int id = Integer.parseInt(opcion);
for (int i = 0; i < listEstudiantes.size(); i++) { if (listEstudiantes.get(i).getIdentificador() == id) { listEstudiantes.remove(i);
System.out.println("El estudiante (identificador=" + id + ") va a ser eliminado");
}
}
} catch (IOException | NumberFormatException e) { System.out.println("No se ha encontrado ningun estudiante cuyo identificador " + e.getMessage()); }
}
}
/**
* Metodo para recuperar un fichero
*/
private void recuperarDeFichero() throws FileNotFoundException { Scanner sc = new Scanner(new File(rutaFichero));
while (sc.hasNextLine()) { String lineaCsv = sc.nextLine();
if (lineaCsv != null && lineaCsv.length() > 0) { //listEstudiantes.add(new Estudiante(0, lineaCsv, lineaCsv, lineaCsv, null, null, null));
listEstudiantes.add(new Estudiante(lineaCsv));
}
}
}
/**
* Metodo para guardar el fichero
*/
private void guardarEnFichero() throws FileNotFoundException, IOException { File fichero = new File(this.rutaFichero);
FileOutputStream outFichero = new FileOutputStream(fichero);
OutputStreamWriter escritor = new OutputStreamWriter(outFichero);
for (Estudiante e : listEstudiantes) { escritor.write(e.lineaCsv() + "\n");
}
escritor.close();
}
/**
* Metodo para generar de forma aleatoria un numero identificador
*/
private int crearIdentificador() { Random rand = new Random();
int identificador = 0;
do { identificador = rand.nextInt((999 - 1) + 1) + 1;
} while (existeIdentificadorEnLista(identificador));
return identificador;
}
/**
* Metodo para comprobar si ya existe el identificador
*/
private boolean existeIdentificadorEnLista(int identificador) { boolean existe = false;
if (listEstudiantes != null && !listEstudiantes.isEmpty()) { for (Estudiante estudiante : listEstudiantes) { if (estudiante.getIdentificador() == identificador) { existe = true;
}
}
}
return existe;
}
/**
* Metodo para pedir una fecha
*/
private Calendar pedirFecha(String string) { return null;
}
/**
* Metodo para pedir una cadena
*/
private String pedirCadena(String mensaje) { String cadena = "";
boolean esCadenaValida = false;
do { try { Scanner sc = new Scanner(System.in);
System.out.print(mensaje);
cadena = sc.nextLine();
if (cadena.length() > 0) { esCadenaValida = true;
} else { throw new ExcepcionCadena();
}
} catch (ExcepcionCadena ex) { System.out.println(ex.getMessage());
}
} while (esCadenaValida == false);
return cadena;
}
/**
* Metodo para pedir un entero
*/
private int pedirEntero(String mensaje) { int entero = -1;
boolean esNumeroValido = false;
do { try { Scanner sc = new Scanner(System.in);
System.out.print(mensaje);
try { entero = sc.nextInt();
//sc.close();
esNumeroValido = true;
} catch (Exception ex) { throw new ExcepcionEntero();
}
} catch (ExcepcionEntero ex) { System.out.println(ex.getMessage());
}
} while (esNumeroValido == false);
return entero;
}
/**
* Metodo para pedir un valor de tipo double
*/
private double pedirDouble(String mensaje) { double d = -1;
boolean esNumeroValido = false;
do { try { Scanner sc = new Scanner(System.in);
System.out.println(mensaje);
try { d = sc.nextDouble();
esNumeroValido = true;
} catch (Exception ex) { throw new ExcepcionEntero();
}
} catch (ExcepcionEntero ex) { System.out.println(ex.getMessage());
}
} while (esNumeroValido == false);
return d;
}
/**
* Metodo para pedir un email
*/
private static String pedirEmail(String email) throws ExcepcionMail { String msg = email;
if (email.contains("@")) return email;
else
throw new ExcepcionMail(msg);
}
/**
* Metodo para limpiar el contenido de la pantalla
* */
public static void limpiarPantalla() { pausar();
for (int i = 0; i < 10; i++) { System.out.println("\n"); }
System.out.flush();
}
public static void pausar() { System.out.print("Pulse una tecla para continuar..."); try { System.in.read();
} catch (IOException e) { e.printStackTrace(System.out);
}
}
/**
* Metodo para salir del sistema
*/
private void salir() { if (listEstudiantes != null && listEstudiantes.size() > 0) { System.out.println("Antes de finalizar, permiteme guardar los datos para la siguiente ocasion en el fichero '" + this.rutaFichero + "'"); try { guardarEnFichero();
System.out.println("El proceso de almacenamiento de datos ha concluido satisfactoriamente"); } catch (Exception ex) { System.out.println("Ha habido un problema al realizar el guardado. No se ha podido almacenar los datos"); }
}
System.out.println("Muchas gracias. ¡Hasta pronto!"); }
}