import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertThrows;

import java.util.ArrayList;
import java.util.List;
import org.junit.jupiter.api.Test;

class PlayableTest {
    private final Song a = new Song("A", "x", 100);
    private final Song b = new Song("B", "y", 200);
    private final Song c = new Song("C", "z", 30);

    @Test
    void songIsALeaf() {
        assertEquals(100, a.seconds());
        assertEquals(1, Playables.countSongs(a));
        assertEquals("1:40", a.length());
    }

    @Test
    void nestedPlaylistAddsEverything() {
        Playlist inner = Playable.playlist("dentro", b, c);
        Playlist outer = Playable.playlist("fuera", a, inner);
        assertEquals(330, outer.seconds());
        assertEquals(3, Playables.countSongs(outer));
        assertEquals(List.of(a, b, c), Playables.songs(outer));
    }

    @Test
    void emptyPlaylistLastsZero() {
        assertEquals(0, Playable.playlist("vacía").seconds());
    }

    @Test
    void playlistCannotBeChangedFromOutside() {
        List<Playable> source = new ArrayList<>(List.of(a));
        Playlist p = new Playlist("p", source);
        source.add(b);
        assertEquals(100, p.seconds());
        assertThrows(UnsupportedOperationException.class, () -> p.entries().add(c));
    }

    @Test
    void treeShowsIndentation() {
        Playlist p = Playable.playlist("fuera", a, Playable.playlist("dentro", c));
        assertEquals("fuera  2:10\n  A  1:40\n  dentro  0:30\n    C  0:30\n", Playables.tree(p));
    }
}
