import java.io.BufferedReader;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.NoSuchFileException;
import java.nio.file.Path;
import java.util.List;
import java.util.stream.Stream;

public class FilesDemo {
    public static void main(String[] args) throws IOException {
        // Rutas: un Path es un nombre, no un archivo abierto.
        Path dir = Path.of("build", "demo");
        Path file = dir.resolve("notas.txt");
        IO.println("ruta: " + file + "  nombre: " + file.getFileName() + "  padre: " + file.getParent());
        IO.println("¿absoluta? " + file.isAbsolute() + "  ¿existe? " + Files.exists(file));

        // Archivos pequeños: todo de una vez.
        Files.createDirectories(dir);
        Files.write(file, List.of("Lima, 18 °C", "Cusco, 9 °C", "Iquitos, 31 °C"));
        List<String> lines = Files.readAllLines(file);
        IO.println("leídas " + lines.size() + " líneas; la segunda es \"" + lines.get(1) + "\"");
        Files.writeString(file, "Puno, 4 °C\n", java.nio.file.StandardOpenOption.APPEND);
        IO.print(Files.readString(file));

        // Archivos grandes: línea por línea, con try-with-resources.
        try (BufferedReader in = Files.newBufferedReader(file)) {
            String line;
            int n = 0;
            while ((line = in.readLine()) != null) {
                if (line.contains("°")) {
                    n++;
                }
            }
            IO.println("con newBufferedReader: " + n + " líneas");
        }
        try (Stream<String> stream = Files.lines(file)) {
            IO.println("con Files.lines: " + stream.filter(l -> l.startsWith("C")).toList());
        }

        // Un archivo que no existe.
        try {
            Files.readAllLines(dir.resolve("no-existe.txt"));
        } catch (NoSuchFileException e) {
            IO.println("NoSuchFileException: " + e.getMessage());
        }

        // Codificación: el mismo texto, escrito en ISO-8859-1 (Latin-1).
        Path latin = dir.resolve("latin1.txt");
        Files.writeString(latin, "Piña, café", StandardCharsets.ISO_8859_1);
        IO.println("bytes en Latin-1: " + Files.size(latin));
        IO.println("bytes en UTF-8:   " + "Piña, café".getBytes(StandardCharsets.UTF_8).length);
        try {
            Files.readString(latin);                    // Files usa UTF-8 por defecto
        } catch (IOException e) {
            IO.println("leído como UTF-8: " + e);
        }
        IO.println("leído como Latin-1: " + Files.readString(latin, StandardCharsets.ISO_8859_1));
        Path utf8 = dir.resolve("utf8.txt");
        Files.writeString(utf8, "Piña, café");
        IO.println("UTF-8 leído como Latin-1: " + Files.readString(utf8, StandardCharsets.ISO_8859_1));
    }
}
