package gtanks.captcha;

import javax.imageio.ImageIO;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.Random;

public class CaptchaGenerator {
    static Random random = new Random();

    public static Captcha generateCaptcha() throws IOException {
        int width = 281;
        int height = 50;
        Color color = Color.decode("#665b67");
        String captchaText = getRandomCaptchaText(6);
        BufferedImage image = new BufferedImage(width, height, 2);

        try {
            image.createGraphics();
            Graphics2D g2d = image.createGraphics();

            g2d.setPaint(color);
            g2d.fillRect(0, 0, width, height);

            double minIntensity = 0.2;
            double maxIntensity = 0.5;

            double noiseDensity = minIntensity + Math.random() * (maxIntensity - minIntensity);
            int noiseAmount = (int) (width * height * noiseDensity);

            for (int i = 0; i < noiseAmount; i++) {
                g2d.setColor(getRandomColor());
                int xPosNoise = (int) (Math.random() * width);
                int yPosNoise = (int) (Math.random() * height);
                g2d.fillRect(xPosNoise, yPosNoise, 1, 1);
            }

            g2d.setPaint(Color.BLACK);
            g2d.setFont(new Font("Times New Roman", 1, 40));
            g2d.drawString(captchaText, 70, 35);

            int lineAmount = 2;
            int midY = height / 2; // Вычисляем середину по оси Y

            for (int i = 0; i < lineAmount; i++) {
                g2d.setColor(Color.BLACK);

                // Определяем, на какой стороне середины канвы будет находиться первая точка линии
                int x1 = (i % 2 == 0) ? 0 : width;
                int y1 = midY + ((i % 2 == 0) ? random.nextInt(20) - 30 : random.nextInt(20));

                // Определяем, на какой стороне середины канвы будет находиться вторая точка линии
                int x2 = (i % 2 == 0) ? width : 0;
                int y2 = midY + ((i % 2 == 0) ? random.nextInt(20) - 30 : random.nextInt(20));

                // Определяем случайное смещение для координат каждой точки линии
                int minOffset = 20;
                int x1Offset = (int) (minOffset + Math.random() * (width / 3 - minOffset));
                int y1Offset = (int) (minOffset + Math.random() * (height / 3 - minOffset));
                int x2Offset = (int) (minOffset + Math.random() * (width / 3 - minOffset));
                int y2Offset = (int) (minOffset + Math.random() * (height / 3 - minOffset));

                // Применяем смещение к координатам
                x1 += (i % 2 == 0) ? x1Offset : -x1Offset;
                y1 += (i % 2 == 0) ? y1Offset : -y1Offset;
                x2 += (i % 2 == 0) ? -x2Offset : x2Offset;
                y2 += (i % 2 == 0) ? y2Offset : -y2Offset;

                g2d.setStroke(new BasicStroke(2));
                g2d.drawLine(x1, y1, x2, y2);
            }


            g2d.dispose();
        } catch (Exception var4) {
            System.out.println(var4.getMessage());
        }

        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        ImageIO.write(image, "png", baos);
        byte[] captchaImageBuffer = baos.toByteArray();

        return new Captcha(captchaImageBuffer, captchaText);
    }

    private static String getRandomCaptchaText(int length) {
        String base = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
        StringBuffer sb = new StringBuffer();

        for (int i = 0; i < length; ++i) {
            int number = random.nextInt(base.length());
            sb.append(base.charAt(number));
        }

        return sb.toString();
    }

    private static Color getRandomColor() {
        String letters = "0123456789ABCDEF";
        StringBuilder color = new StringBuilder("#");
        for (int i = 0; i < 6; i++) {
            color.append(letters.charAt((int) (Math.random() * 16)));
        }
        return Color.decode(color.toString());
    }

    public static class Captcha {
        private byte[] image;
        private String text;

        public Captcha(byte[] image, String text) {
            this.image = image;
            this.text = text;
        }

        public byte[] getImage() {
            return image;
        }

        public String getText() {
            return text;
        }
    }
}
 сделай чтобы линии не ложились на одно и тоже место в избижания наложения линии на линию, и желательно без новых метедов