package shape;

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


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

public class Drawer {
    private List<Shape> shapes;
//    private double width;
//    private double height;
    private Canvas canvas;
    private GraphicsContext gc;

    private Rectangle tempRectangle = null;

    public Drawer(double width, double height) {
//        this.width = width;
//        this.height = height;
        shapes = new ArrayList<>();
        canvas = new Canvas(width,height);
        gc = canvas.getGraphicsContext2D();
        setupMouseHandlers();
    }

    public void add(Shape shape) {
        shapes.add(shape);
    }
    public void repaint(){
        gc.clearRect(0, 0, canvas.getWidth(), canvas.getHeight());
        for(Shape shape : shapes){
            shape.paint(gc);
        }
        if (tempRectangle != null){
            tempRectangle.paint(gc);
        }
    }

    private void setupMouseHandlers(){
        canvas.setOnMousePressed(event -> {
            if(event.getButton() == MouseButton.PRIMARY){
                double x = event.getX();
                double y = event.getY();
                tempRectangle = new Rectangle(x, y, 0, 0);
            }
        });

        canvas.setOnMouseDragged(event ->{
            if (tempRectangle != null) {
                double x = event.getX();
                double y = event.getY();
                tempRectangle.updateSize(x,y);
                repaint();
            }
        });

        canvas.setOnMouseReleased(event -> {
            if(event.getButton() == MouseButton.PRIMARY){
                shapes.add(tempRectangle);
                tempRectangle = null;
                repaint();
            }
        });
    }

    public Shape shapeContaining(double x, double y){
        for(Shape shape : shapes){
            if (shape.contains(x, y)){
                return shape;
            }
        }
        return null;
    }

    public Canvas getCanvas() {
        return canvas;
    }
}