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

import java.io.ByteArrayOutputStream;
import java.io.PrintStream;
import java.nio.charset.StandardCharsets;
import java.util.List;
import java.util.Scanner;
import org.junit.jupiter.api.Test;

class PlaylistCliTest {
    private final LoggingSongRepositoryTest.InMemoryRepository repo = new LoggingSongRepositoryTest.InMemoryRepository();

    private String run(String input) {
        ByteArrayOutputStream bytes = new ByteArrayOutputStream();
        PrintStream out = new PrintStream(bytes, true, StandardCharsets.UTF_8);
        new PlaylistCli(new Scanner(input), out, repo).run();
        return bytes.toString(StandardCharsets.UTF_8);
    }

    @Test
    void addAndSave() {
        String output = run("agregar A;B;100\nguardar\nsalir\n");
        assertEquals(List.of(new Song("A", "B", 100)), repo.stored);
        assertTrue(output.contains("guardadas 1 canciones"));
    }

    @Test
    void badInputDoesNotStopTheMenu() {
        String output = run("agregar A;B\nfoo\nagregar A;B;x\nlistar\nsalir\n");
        assertTrue(output.contains("uso: agregar título;artista;segundos"));
        assertTrue(output.contains("comando desconocido: foo"));
        assertTrue(output.contains("no se agregó: la duración no es un número"));
        assertTrue(output.endsWith("hasta luego" + System.lineSeparator()));
    }

    @Test
    void endOfInputEndsTheLoop() {
        String output = run("listar\n");
        assertTrue(output.endsWith("> "));
    }
}
