import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

public class AsciiArtGenerator {

    // Caracteres ordenados de menor a mayor intensidad
    private static final String ASCII_CHARS = "@%#*+=-:. ";

    public static void main(String[] args) {
        if (args.length < 1) {
            System.out.println("Uso: java AsciiArtGenerator <ruta de la imagen>");
            return;
        }

        String imagePath = args[0];
        try {
            BufferedImage image = ImageIO.read(new File(imagePath));
            String asciiArt = convertToAscii(image);
            System.out.println(asciiArt);
        } catch (IOException e) {
            System.err.println("Error al cargar la imagen: " + e.getMessage());
        }
    }

    private static String convertToAscii(BufferedImage image) {
        StringBuilder sb = new StringBuilder();
        int width = image.getWidth();
        int height = image.getHeight();

        // Redimensionar la imagen para que quepa en la consola
        int newWidth = 100;
        int newHeight = (int) (height * ((double) newWidth / width) / 2); // Dividir por 2 para ajustar la proporción

        BufferedImage resizedImage = new BufferedImage(newWidth, newHeight, BufferedImage.TYPE_INT_RGB);
        resizedImage.getGraphics().drawImage(image, 0, 0, newWidth, newHeight, null);

        for (int y = 0; y < newHeight; y++) {
            for (int x = 0; x < newWidth; x++) {
                int pixel = resizedImage.getRGB(x, y);
                int r = (pixel >> 16) & 0xff;
                int g = (pixel >> 8) & 0xff;
                int b = pixel & 0xff;
                int gray = (r + g + b) / 3; // Convertir a escala de grises

                // Mapear el valor de gris a un carácter ASCII
                int index = gray * (ASCII_CHARS.length() - 1) / 255;
                sb.append(ASCII_CHARS.charAt(index));
            }
            sb.append("\n");
        }

        return sb.toString();
    }
}