Untitled

mail@pastecode.io avatar
unknown
plain_text
a year ago
4.8 kB
3
Indexable
Never
package fp.shows;

import java.time.LocalDate;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Set;

import fp.common.Puntuacion;
import fp.utiles.Checkers;







public class Cinematografica {
	
	private LocalDate fechaEstreno;
	private String nombre;
	private Integer usuarios;
	private Boolean compartida;
	private List<Serie> series;
	
	
	public Cinematografica(LocalDate fechaEstreno, String nombre,Integer usuarios,Boolean compartida, List<Serie> series) {
		super();
		this.fechaEstreno = fechaEstreno;
		this.nombre = nombre;
		this.usuarios=usuarios;
		this.compartida=compartida;
		this.series = new ArrayList<>(series);
	}


	public Cinematografica( String nombre,Integer usuarios,Boolean compartida) {
		super();
		
		Checkers.check("El nombre de la serie no puede estar vacío", !nombre.isEmpty());

		
		this.fechaEstreno = LocalDate.now();
		this.nombre = nombre;
		this.usuarios=usuarios;
		this.compartida=compartida;
		this.series = new ArrayList<>();
	}


	public Boolean getCompartida() {
		return compartida;
	}


	public void setCompartida(Boolean compartida) {
		this.compartida = compartida;
	}


	public LocalDate getFechaEstreno() {
		return fechaEstreno;
	}


	public String getNombre() {
		return nombre;
	}




	public Integer getUsuarios() {
		return usuarios;
	}


	public List<Serie> getSeries() {
		return new ArrayList<>(series);
	}





	@Override
	public String toString() {
		return "Cinematografica [fechaEstreno=" + fechaEstreno + ", nombre=" + nombre + ", usuarios=" + usuarios
				+ ", compartida=" + compartida + ", series=" + series + "]";
	}


	@Override
	public int hashCode() {
		return Objects.hash(fechaEstreno, nombre);
	}


	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Cinematografica other = (Cinematografica) obj;
		return Objects.equals(fechaEstreno, other.fechaEstreno) && Objects.equals(nombre, other.nombre);
	}

	
	//Otras operaciones
	
	public Integer getNumeroSeries() {
		return series.size();
	}
	
	
	public void añadeSerie(Serie s) {
		if (!series.contains(s)) {
			series.add(s);			
		}
	}
	
	public void añadeSeries(Collection<Serie> c) {
		for (Serie r: c) {
			añadeSerie(r);
		}
		
	}
	
	public void eliminaSerie(Serie s) {
		series.remove(s);
	}
	
	// 1.Si hay series estrenada en ese año vuelve true si no devuelve false. (Tratamiento: existe)
	public Boolean existeSerieEstrenadaEnTalAño(Integer año ) {
		Boolean existeSerie = false;

		for (Serie s: series) {
		   if (s.getFechaEstreno().getYear()==año) {
			   existeSerie = true;
		      break;
		   }
		} 

		return existeSerie;
	}
	
	// 2. Media  calificacion de las series por el numero de temporadas. (Tratamiento: media)
	public Double getMediaCalificacionSeriePorTemporada( Integer temporadas) {
		Double sumaCalificacion = 0.;
		Integer numeroSeries = 0;
		
		for (Serie s: series) {
			if (s.getTemporadas().equals(temporadas) ) {
				sumaCalificacion += s.getCalificacion();
				numeroSeries++;
			}
		}
		
		Double media = null;
		if (numeroSeries > 0) {
		   media = sumaCalificacion / numeroSeries;
		}
		
		return media;
	}
	
    // 3. Series con directores.
	public List<String> getSeriesConDirectores(Set<String> directores) {
		List<String> seriesConDirectores = new ArrayList<>();

		for (Serie s: series) {
		   List<String> directoresComunes = new ArrayList<>(s.getDirectores());
		   directoresComunes.retainAll(directores);
		   if (!directoresComunes.isEmpty()) {
			   seriesConDirectores.add(s.getNombre()); 
		   }
		}

		return seriesConDirectores;
	
	
	}
	
	// 4. (Tratamiento: Map con valores de tipo colección)
	public Map<Genero, List<Serie>> getSeriesPorGenero() {
		Map<Genero, List<Serie>> res = new HashMap<>();
		
		for (Serie s: series) {
			Genero ge = s.getGenero();
			if (res.containsKey(ge)) {
				res.get(ge).add(s);
			} else {
				List<Serie> lista = new ArrayList<>();
				lista.add(s);
				res.put(ge, lista);
			}
		}
		
		return res;		
}
	
	// 5. (Tratamiento: Map contador)
	public Map<String, Integer> getNumeroSeriesConPais() { 
		Map<String, Integer> res = new HashMap<>();
		
		for (Serie s: series) {
			
				List<String> paises = s.getPaises();
				for (String pais:paises) {

				if (res.containsKey(pais)) {
					res.put(pais, res.get(pais) + 1);
				} else {
					res.put(pais,1);
				}				
			}
		}
		
		
		return res;
	}
	
}