package shape.tp5;

import javafx.scene.canvas.Canvas;
import javafx.scene.canvas.GraphicsContext;
import javafx.scene.input.MouseButton;
import javafx.scene.input.MouseEvent;

import java.util.ArrayList;
import java.util.List;


class Drawer extends Canvas {
    private List<Shape> shapes = new ArrayList<>();
    private double startX, startY, endX, endY;
    private boolean drawing = false;

    public Drawer(double width, double height) {
        super(width, height);
        setOnMousePressed(this::handleMousePressed);
        setOnMouseDragged(this::handleMouseDragged);
        setOnMouseReleased(this::handleMouseReleased);
    }

    private void handleMousePressed(MouseEvent event) {
        if (event.getButton() == MouseButton.PRIMARY) {
            startX = event.getX();
            startY = event.getY();
            drawing = true;
        }
    }

    private void handleMouseDragged(MouseEvent event) {
        if (drawing) {
            endX = event.getX();
            endY = event.getY();
            repaint();
        }
    }

    private void handleMouseReleased(MouseEvent event) {
        if (drawing) {
            endX = event.getX();
            endY = event.getY();
            shapes.add(new Rectangle(Math.min(startX, endX), Math.min(startY, endY),
                    Math.abs(endX - startX), Math.abs(endY - startY)));
            drawing = false;
            repaint();
        }
    }

    public void repaint() {
        GraphicsContext gc = getGraphicsContext2D();
        gc.clearRect(0, 0, getWidth(), getHeight());
        for (Shape shape : shapes) {
            shape.paint(gc);
        }
        if (drawing) {
            gc.setStroke(javafx.scene.paint.Color.BLACK);
            gc.strokeRect(Math.min(startX, endX), Math.min(startY, endY),
                    Math.abs(endX - startX), Math.abs(endY - startY));
        }
    }
}