import java.io.IOException;
import java.io.PrintStream;
import java.nio.file.NoSuchFileException;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

/**
 * Un menú de línea de comandos: lee un comando por línea y lo ejecuta.
 * Recibe la entrada, la salida y el repositorio, así que se puede probar
 * sin teclado ni archivos.
 */
public class PlaylistCli {
    private final Scanner in;
    private final PrintStream out;
    private final SongRepository repo;
    private final List<Song> songs = new ArrayList<>();

    public PlaylistCli(Scanner in, PrintStream out, SongRepository repo) {
        this.in = in;
        this.out = out;
        this.repo = repo;
    }

    public void run() {
        load();
        out.println("comandos: listar, agregar título;artista;segundos, guardar, salir");
        while (true) {
            out.print("> ");
            if (!in.hasNextLine()) {
                break;                          // se acabó la entrada
            }
            String line = in.nextLine().strip();
            String command = line.contains(" ") ? line.substring(0, line.indexOf(' ')) : line;
            String rest = line.substring(command.length()).strip();
            switch (command) {
                case "listar" -> list();
                case "agregar" -> add(rest);
                case "guardar" -> save();
                case "salir" -> {
                    out.println("hasta luego");
                    return;
                }
                case "" -> { }
                default -> out.println("comando desconocido: " + command);
            }
        }
    }

    private void load() {
        try {
            songs.addAll(repo.load());
            out.println("cargadas " + songs.size() + " canciones");
        } catch (NoSuchFileException e) {
            out.println("no hay archivo todavía; se empieza con una lista vacía");
        } catch (IOException e) {
            out.println("no se pudo cargar: " + e.getMessage());
        }
    }

    private void list() {
        for (int i = 0; i < songs.size(); i++) {
            Song s = songs.get(i);
            out.printf("%d. %s - %s (%d s)%n", i + 1, s.title(), s.artist(), s.seconds());
        }
    }

    private void add(String args) {
        String[] f = args.split(";");
        try {
            if (f.length != 3) {
                throw new IllegalArgumentException("uso: agregar título;artista;segundos");
            }
            songs.add(new Song(f[0].strip(), f[1].strip(), Integer.parseInt(f[2].strip())));
            out.println("agregada: " + f[0].strip());
        } catch (NumberFormatException e) {
            out.println("no se agregó: la duración no es un número");
        } catch (IllegalArgumentException e) {
            out.println("no se agregó: " + e.getMessage());
        }
    }

    private void save() {
        try {
            repo.save(songs);
            out.println("guardadas " + songs.size() + " canciones");
        } catch (IOException e) {
            out.println("no se pudo guardar: " + e.getMessage());
        }
    }

    public static void main(String[] args) {
        Path file = Path.of(args.length > 0 ? args[0] : "canciones.csv");
        new PlaylistCli(new Scanner(System.in), System.out, new CsvSongRepository(file)).run();
    }
}
