package com.alura.screenmatch.modelos;
import java.time.Year;
/**
* Representa una película con datos básicos y sistema de evaluaciones.
* Aplica encapsulamiento, validaciones y formato profesional.
*/
public class Pelicula {
private String nombre;
private int fechaDeLanzamiento;
private int duracionEnMinutos;
private boolean incluidoEnPlan;
private double sumaEvaluaciones = 0.0;
private int totalEvaluaciones = 0;
/** Constructor por defecto */
public Pelicula() { }
// ——— Getters ——————————————————————————————————————————————
/**
* @return el título de la película
*/
public String getNombre() {
return nombre;
}
/**
* @return el año de estreno
*/
public int getFechaDeLanzamiento() {
return fechaDeLanzamiento;
}
/**
* @return la duración en minutos
*/
public int getDuracionEnMinutos() {
return duracionEnMinutos;
}
/**
* @return true si la película está incluida en el plan
*/
public boolean isIncluidoEnPlan() {
return incluidoEnPlan;
}
/**
* @return la cantidad total de evaluaciones recibidas
*/
public int getTotalEvaluaciones() {
return totalEvaluaciones;
}
// ——— Setters con validación ——————————————————————————————————
/**
* Asigna el nombre de la película.
* @param nombre no puede ser null o vacío
* @throws IllegalArgumentException si el nombre es inválido
*/
public void setNombre(String nombre) {
if (nombre == null || nombre.isBlank()) {
throw new IllegalArgumentException("El nombre no puede quedar vacío.");
}
this.nombre = nombre;
}
/**
* Asigna el año de lanzamiento.
* @param fechaDeLanzamiento entre 1888 y el año actual
* @throws IllegalArgumentException si el año es inválido
*/
public void setFechaDeLanzamiento(int fechaDeLanzamiento) {
int añoActual = Year.now().getValue();
if (fechaDeLanzamiento < 1888 || fechaDeLanzamiento > añoActual) {
throw new IllegalArgumentException("Año de lanzamiento inválido: " + fechaDeLanzamiento);
}
this.fechaDeLanzamiento = fechaDeLanzamiento;
}
/**
* Asigna la duración en minutos.
* @param duracionEnMinutos mayor que 0
* @throws IllegalArgumentException si la duración no es positiva
*/
public void setDuracionEnMinutos(int duracionEnMinutos) {
if (duracionEnMinutos <= 0) {
throw new IllegalArgumentException("La duración debe ser mayor a cero.");
}
this.duracionEnMinutos = duracionEnMinutos;
}
/**
* Marca si la película está incluida en el plan.
*/
public void setIncluidoEnPlan(boolean incluidoEnPlan) {
this.incluidoEnPlan = incluidoEnPlan;
}
// ——— Métodos de negocio ————————————————————————————————————
/**
* Imprime por consola la ficha técnica de la película
* (incluye nombre, año, duración, plan y calificación media).
*/
public void MuestraFichaTecnica() {
System.out.println("===== FICHA TÉCNICA =====");
System.out.println("Nombre: " + nombre);
System.out.println("Año de lanzamiento: " + fechaDeLanzamiento);
System.out.println("Duración (min): " + duracionEnMinutos);
System.out.println("Incluida en plan: " + (incluidoEnPlan ? "Sí" : "No"));
System.out.printf ("Calif. media: %.2f (%d evaluaciones)%n",
CalcularMedia(), totalEvaluaciones);
System.out.println("========================");
}
/**
* Agrega una nueva nota al acumulado de evaluaciones.
* @param nota valor entre 0.0 y 10.0
* @throws IllegalArgumentException si la nota está fuera de rango
*/
public void Evalua(double nota) {
if (nota < 0.0 || nota > 10.0) {
throw new IllegalArgumentException("La nota debe estar entre 0 y 10.");
}
sumaEvaluaciones += nota;
totalEvaluaciones++;
}
/**
* Calcula el promedio de todas las evaluaciones.
* @return promedio (0.0 si no hay evaluaciones)
*/
public double CalcularMedia() {
return totalEvaluaciones == 0
? 0.0
: sumaEvaluaciones / totalEvaluaciones;
}
@Override
public String toString() {
return String.format("%s (%d) – %d min – Plan: %s – ★ %.1f",
nombre,
fechaDeLanzamiento,
duracionEnMinutos,
incluidoEnPlan ? "Sí" : "No",
CalcularMedia());
}
}