//Siempre agregar saltos de linea para identificar mejor los procedimientos package alura.RacsoFilm.principal;
public class Principal {
private Scanner teclado = new Scanner(System.in);
private ConsumoApi consumoApi = new ConsumoApi();
private final String URL_BASE = "https://www.omdbapi.com/?t=";
private final String API_KEY = "&apikey=17c1aa82";
private ConvierteDatos conversor = new ConvierteDatos();
public void muestraMenu(){
System.out.println("Por favor escribe, el nombre de la serie que deseas buscar: ");
//Busca los datos generales de las series
var nombreSerie = teclado.nextLine();
var json = consumoApi.obtenerDatos(URL_BASE + nombreSerie.replace(" ", "+") + API_KEY);
var datos = conversor.obtenerDatos(json, DatosSerie.class);
System.out.println(datos + "\n");
//Busca los datos de todas las temporadas
List<DatosTemporadas> temporadas = new ArrayList<>();
for (int i = 1; i <= datos.totalTemporadas(); i++) {
json = consumoApi.obtenerDatos(URL_BASE + nombreSerie.replace(" ", "+") + "&Season=" +i+ API_KEY);
var datosTemporadas = conversor.obtenerDatos(json, DatosTemporadas.class);
temporadas.add(datosTemporadas);
}
//Imprimiendo lo de la lista
//temporadas.forEach(System.out::println);
//Simplificando el for int anterior
temporadas.forEach(t -> t.episodios().forEach(e -> System.out.println(e.titulo())));
//Convertir toda las informaciones o una lista del tipo DatosEpisodio
List<DatosEpisodio> datosEpisodios = temporadas.stream()
.flatMap(t -> t.episodios().stream())
/* Lista mutable que pueda cambiar con el tiempo */
.collect(Collectors.toList());
//Conviertiendo los datos a una lista del tipo Episodio
List<Episodio> episodios = temporadas.stream()
.flatMap(t -> t.episodios().stream()
.map(d -> new Episodio(t.numero(),d)))
.collect(Collectors.toList());
//Imprimir los episodios
episodios.forEach(System.out::println);
/* System.out.println("\n");
//Busqueda de episodios apartir de un año especifico
System.out.println("Indica el año apartir del cual deseas ver los episodios, por favor");
var fecha = teclado.nextInt();
teclado.nextLine();
LocalDate fechaBusqueda = LocalDate.of(fecha, 1, 1);
DateTimeFormatter formatoFecha = DateTimeFormatter.ofPattern("dd/MM/yyyy");
episodios.stream()
.filter(e -> e.getFechaLanzamiento() != null && e.getFechaLanzamiento().isAfter(fechaBusqueda))
.forEach(e -> System.out.println(
"Temporada " + e.getTemporada() +
"Episodio " + e.getTitulo() +
"Fecha de Lanzamiento " + e.getFechaLanzamiento().format(formatoFecha)
)); */
//Busca episodios por frases del titulo
/* System.out.println("Escriba la frase del titulo que desea ver, por favor");
var fraseTitulo = teclado.nextLine();
Optional<Episodio> episodioBuscado = episodios.stream()
.filter(e -> e.getTitulo().toUpperCase().contains(fraseTitulo.toUpperCase()))
.findFirst();
if(episodioBuscado.isPresent()){
System.out.println("Episodio encontrado: ");
System.out.println("Los datos son: " + episodioBuscado.get());
}else{
System.out.println("Episodio no encontrado." + "\n");
} */
//Creando evaluacion por temporada
Map<Integer, Double> evaluacionTemporada = episodios.stream()
.filter(e -> e.getEvaluacion() > 0.0)
.collect(Collectors.groupingBy(Episodio::getTemporada,
Collectors.averagingDouble(Episodio::getEvaluacion)));
System.out.println("Evaluacion por temporada: " + evaluacionTemporada);
//Estadisticas
DoubleSummaryStatistics estadisticas = episodios.stream()
.filter(e -> e.getEvaluacion() > 0.0)
.collect(Collectors.summarizingDouble(Episodio::getEvaluacion));
System.out.println("\n");
System.out.println("Media de la serie: " + estadisticas.getAverage());
System.out.println("Episodio mejor evaluado: " + estadisticas.getMax());
System.out.println("Episodio peor evaluado: " + estadisticas.getMin());
}
}