import javax.swing.*;
import java.awt.*;
import java.util.Random;
/**
 *
 * @author car20
 */
public class PeceraGUI extends JPanel {

    private static final int ANCHO = 60;
    private static final int ALTO = 20;

    private static final String[][] PECES = {
        {
            "        ,-",
            "     ,/.(     __",
            "   ,-'    `!._/ /",
            "  > @ )<|    _ <",
            "   `-....,,;' \\\\_"
        },
        {
            "        ,-",
            "     ,/.(     __",
            "   ,-'    `!._/ /",
            "  > @ )<|    _ <",
            "   `-....,,;' \\\\_"
        },
        {
            "|\\   \\\\__     o",
            "| \\_/    o \\    o",
            "> _   (( <_  oo",
            "| / \\__+___/",
            "|/     |/"
        }
    };

    private static final String[] ALGAS = {
        "⠀    ⠀⠀⠀⠀⠀⠀⣴⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
        "⠀     ⠀⠀⠀⠀⣸⠛⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
        "⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⡏⢠⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
        "⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠘⣧⡈⢿⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
        "⠀⠀⠀⠀⢸⣶⡀⠀⠀⠀⠀⠙⣷⣄⠙⣦⡀⠀⠀⠀⠀⠀⠀⠀",
        "⠀⠀⠀⠀⠀⣿⠿⣄⠀⠀⠀⠀⢸⣿⡆⢸⣷⠀⠀⠀⠀⠀⠀⠀⠀⠀",
        "⠀⠀⠀⠀⢀⡇⢰⣿⠂⠀⠀⠀⣸⣿⠃⣸⡿⠀⠀⠀⠀⠀⠀⠀⠀⠀",
        "⠀⠀⠀⠀⣿⠁⣼⠁⠀⠀⠀⣰⡿⠁⣴⡿⠁⠀⠀⠀⠀",
        "⠀⠀⠀⠀⣿⠀⣿⣆⠀⠀⢠⣿⠇⢸⣿⠃⠀⠀⠀⠀",
        "⠀⠀⠀⠀⢹⣇⠘⣿⡄⠀⠘⣿⠀⣾⣿⡀⠀⠀",
        "⠀⠀⠀⠀⣸⣿⠀⣿⡇⠀⣤⠙⠀⢸⣿⣧⡀⠀⠀",
        "⠀⠀⠀⣰⣿⠏⢠⣿⡇⠀⢹⣷⣤⠈⢿⠁",
        "⠀⠀⠠⡿⠃⣰⣿⠟⠀⠀",
        "⠀⠀⠀⠀⠊⠉⠀⠀⠀⠀⠀"
    };

    private static int[] pecesX = new int[PECES.length];
    private static int[] pecesY = new int[PECES.length];
    private static int[] direccionesX = new int[PECES.length];

    private static final Random random = new Random();

    private int[] burbujasX = new int[10];
    private int[] burbujasY = new int[10];

    public PeceraGUI() {
        setPreferredSize(new Dimension(ANCHO * 10, ALTO * 20));
        setBackground(Color.BLACK);
        setForeground(Color.WHITE);
        setFont(new Font("Monospaced", Font.PLAIN, 12));

        for (int i = 0; i < PECES.length; i++) {
            pecesX[i] = random.nextInt(ANCHO - 10) + 1;
            pecesY[i] = random.nextInt(ALTO - 5) + 1;
            direccionesX[i] = random.nextBoolean() ? 1 : -1;
        }

        // Inicializar burbujas
        for (int i = 0; i < burbujasX.length; i++) {
            burbujasX[i] = random.nextInt(ANCHO - 2) + 1;
            burbujasY[i] = random.nextInt(ALTO - 2) + 1;
        }

        Timer timer = new Timer(200, e -> {
            moverPeces();
            moverBurbujas();
            repaint();
        });
        timer.start();
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        dibujarMar(g);
    }

    private void dibujarMar(Graphics g) {
        g.setColor(Color.WHITE);

        // Dibujar burbujas
        for (int i = 0; i < burbujasX.length; i++) {
            g.drawString("o", burbujasX[i] * 10, burbujasY[i] * 20);
        }

        // Dibujar peces
        for (int i = 0; i < PECES.length; i++) {
            for (int j = 0; j < PECES[i].length; j++) {
                g.drawString(PECES[i][j], pecesX[i] * 10, (pecesY[i] + j) * 20);
            }
        }

        // Dibujar algas al fondo
        for (int i = 0; i < ALGAS.length; i++) {
            g.drawString(ALGAS[i], 5, (ALTO * 20) - (ALGAS.length - i) * 15);
        }
    }

    private void moverPeces() {
        for (int i = 0; i < PECES.length; i++) {
            pecesX[i] += direccionesX[i];

            if (pecesX[i] + 10 >= ANCHO || pecesX[i] <= 0) {
                direccionesX[i] *= -1;
            }
        }
    }

    private void moverBurbujas() {
        for (int i = 0; i < burbujasY.length; i++) {
            if (i % 2 == 0) {
                burbujasY[i] -= 1; // Mover más lento
            }

            if (burbujasY[i] <= 0) {
                burbujasY[i] = ALTO - 2;
                burbujasX[i] = random.nextInt(ANCHO - 2) + 1;
            }
        }
    }

    public static void main(String[] args) {
        JFrame frame = new JFrame("Pecera ASCII");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(new PeceraGUI());
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
}