package music;

import java.util.ArrayList;

/**
 * Una lista de reproducción. Guarda sus canciones en un ArrayList que nadie
 * más ve: los demás solo pueden usar los métodos de esta clase.
 */
public class Playlist {
    private final String name;
    private final ArrayList<Song> songs = new ArrayList<>();

    public Playlist(String name) {
        this.name = name;
    }

    public String name() {
        return name;
    }

    public void add(Song song) {
        if (song == null) {
            throw new IllegalArgumentException("no se puede agregar null");
        }
        songs.add(song);
    }

    public int size() {
        return songs.size();
    }

    /** La canción en la posición index, desde 0. */
    public Song get(int index) {
        return songs.get(index);
    }

    public boolean contains(Song song) {
        return songs.contains(song);
    }

    /** Duración total en segundos; 0 si está vacía. */
    public int totalSeconds() {
        int total = 0;
        for (Song s : songs) {
            total += s.seconds();
        }
        return total;
    }

    /** La canción más larga; si hay empate, la primera. La lista no puede estar vacía. */
    public Song longest() {
        if (songs.isEmpty()) {
            throw new IllegalArgumentException("la lista " + name + " está vacía");
        }
        Song best = songs.get(0);
        for (Song s : songs) {
            if (s.seconds() > best.seconds()) {
                best = s;
            }
        }
        return best;
    }

    /** Quita las canciones que duran menos de seconds. Devuelve cuántas quitó. */
    public int removeShorterThan(int seconds) {
        int removed = 0;
        // De atrás hacia adelante: al quitar una, las que faltan revisar no se mueven.
        for (int i = songs.size() - 1; i >= 0; i--) {
            if (songs.get(i).seconds() < seconds) {
                songs.remove(i);
                removed++;
            }
        }
        return removed;
    }

    /** Una copia de las canciones: cambiarla no cambia la lista. */
    public ArrayList<Song> songs() {
        return new ArrayList<>(songs);
    }
}
