package school_project;

import javafx.scene.Group;
import javafx.scene.input.MouseButton;
import school_project.Menu.MenuAccueil;
import school_project.Menu.ScreenLevelFinish;
import school_project.Utils.MatrixShape;

import java.io.FileNotFoundException;

public class GameUI extends Group{
    public final static int SEGMENT_SIZE = 50;
    public final static int SPACE_SIZE = 5;
    private final Vec2 piece_pos_click = new Vec2();

    public GameUI(Map level) throws FileNotFoundException {
        super();

        MatrixShape grid = new MatrixShape(level);

        //center the grid
        grid.setLayoutX((Controller.screen_size.x - grid.boundary_size.x) >> 1);
        grid.setLayoutY((Controller.screen_size.y - grid.boundary_size.y) >> 1);

        getChildren().add(grid);

        Vec2 piece_space = new Vec2(SPACE_SIZE, SPACE_SIZE);
        int column = 0;
        for (Piece p : level.getPieces()) {
            MatrixShape _piece = new MatrixShape(p);

            _piece.setLayoutX(piece_space.x);
            _piece.setLayoutY(piece_space.y);

            piece_space.y += _piece.boundary_size.y;

            if(piece_space.y >= Controller.screen_size.y){
                column++;
                piece_space.y = SPACE_SIZE;
                piece_space.x = (SEGMENT_SIZE*3 + SPACE_SIZE*4 )* column;
            }

            // Pieces Events
            _piece.setOnMouseClicked(event -> {
                if(event.getButton() == MouseButton.SECONDARY){
                    ((Piece) _piece.shape).RotateRight(1);
                    _piece.update();
                }
            });
            _piece.setOnMousePressed(event -> {
                piece_pos_click.x = (int) event.getX();
                piece_pos_click.y = (int) event.getY();
            });
            _piece.setOnMouseDragged(event -> {
                _piece.toFront();
                _piece.setLayoutX(event.getSceneX() - piece_pos_click.x);
                _piece.setLayoutY(event.getSceneY() - piece_pos_click.y);
            });
            _piece.setOnMouseReleased(event -> {
                if(event.getButton() != MouseButton.PRIMARY)
                    return;
                if(event.getSceneX() > grid.getLayoutX() && event.getSceneX() < grid.getLayoutX() + grid.boundary_size.x
                    && event.getSceneY() > grid.getLayoutY() && event.getSceneY() < grid.getLayoutY() + grid.boundary_size.y )
                {
                    // Inverted because screen is x →; y ↓ and matrix is x ↓; y →
                    Vec2 piece_position_in_grid = new Vec2(
                            (int) (_piece.getLayoutY() + (SEGMENT_SIZE+SPACE_SIZE)/2 - grid.getLayoutY())/(SEGMENT_SIZE+SPACE_SIZE),
                            (int) (_piece.getLayoutX() + (SEGMENT_SIZE+SPACE_SIZE)/2 - grid.getLayoutX())/(SEGMENT_SIZE+SPACE_SIZE)
                    );
                    System.out.println(level.placePiece(p, piece_position_in_grid) + piece_position_in_grid.toString());
                    if(p.getPosition() != null){
                        _piece.setLayoutX(grid.getLayoutX() + p.getPosition().y * (SEGMENT_SIZE+SPACE_SIZE));
                        _piece.setLayoutY(grid.getLayoutY() + p.getPosition().x * (SEGMENT_SIZE+SPACE_SIZE));
                    }
                    if(level.gameDone()){
                        Controller.switchRoot(new ScreenLevelFinish());
                    }
                }
            });

            getChildren().add(_piece);
        }
    }
}