package com.aluracursos.screenmatch.principal;
import com.aluracursos.screenmatch.model.DatosEpisodio;
import com.aluracursos.screenmatch.model.DatosSerie;
import com.aluracursos.screenmatch.model.DatosTemporadas;
import com.aluracursos.screenmatch.model.Episodio;
import com.aluracursos.screenmatch.service.ConsumoAPI;
import com.aluracursos.screenmatch.service.ConvierteDatos;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Scanner;
import java.util.stream.Collectors;
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=c236e1a";
private ConvierteDatos conversor = new ConvierteDatos();
public void muestraElMenu(){
System.out.println("Por favor escribe el nombre de la serie que deseas buscar: ");
// Busca los datos de serie
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);
// Busca los datos de todas las temporadas
List<DatosTemporadas> temporadas = new ArrayList<>();
for (int i = 1; i <= datos.totalDeTemporadas(); i++) {
json = consumoApi.obtenerDatos(URL_BASE + nombreSerie.replace(" ", "+") + "&Season=" + i + API_KEY);
var datosTemporadas = conversor.obtenerDatos(json, DatosTemporadas.class);
temporadas.add(datosTemporadas);
}
//temporadas.forEach(System.out::println); //se imprime toda la temporada
// Mostrr solo el titulo de los episodios para las tempordas
// for (int i = 0; i < datos.totalDeTemporadas(); i++) {
// List<DatosEpisodio> episodioTemporada = temporadas.get(i).episodios();
// for (int j = 0; j < episodioTemporada.size(); j++) {
// System.out.println(episodioTemporada.get(j).titulo());
// }
// }
// Mejorando usando funciones Lambda
//temporadas.forEach(t -> t.episodios().forEach(e -> System.out.println(e.titulo())));
// Convertir todas las informaciones a una lista del tipo DatosEpisodio
List<DatosEpisodio> datosEpisodios = temporadas.stream()
.flatMap(t->t.episodios().stream())
.collect(Collectors.toList());
// Top 5 episodios
System.out.println("Top 5 episoios");
datosEpisodios.stream()
.filter(e->!e.evalucion().equalsIgnoreCase("N/A"))
.sorted(Comparator.comparing(DatosEpisodio::evalucion).reversed())
.limit(5)
.forEach(System.out::println);
// Conviertiendo los datos a un alista del tipo episodio
List<Episodio> episodios = temporadas.stream()
.flatMap(t->t.episodios().stream()
.map(d->new Episodio(t.numero(), d)))
.collect(Collectors.toList());
episodios.forEach(System.out::println);
// Busqueda de episodios a partir de X año
System.out.println("Indica el año a partir del sual deseas ver los episodios");
var fecha = teclado.nextInt();
teclado.nextLine();
LocalDate fechaBusqueda = LocalDate.of(fecha, 1, 1);
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("dd/MM/yyyy");
episodios.stream()
.filter(e->e.getFechaDeLAnzamiento() != null && e.getFechaDeLAnzamiento().isAfter(fechaBusqueda))
.forEach(e-> System.out.println(
"Temporada " + e.getTemporada() +
"Episodio " + e.getTitulo() +
"Fecha de Lanzamiento " + e.getFechaDeLAnzamiento().format(dtf)
));
}
}