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!");
}
}