package school_project;

import school_project.Utils.Array;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Random;

public class MapGenerator {
    private static final Random rand = new Random();
    public enum Difficulty {
        Easy,
        Medium,
        Difficult,
    }
    public static Map generate(Difficulty difficulty){
        Vec2 map_size;
        int depth = 1; // how much the map shape generator could grind

        // define map size depending on the difficulty
        switch (difficulty){
            case Easy -> map_size = new Vec2(rand.nextInt(3, 5), rand.nextInt(3, 5));
            case Medium -> map_size = new Vec2(rand.nextInt(5, 8), rand.nextInt(5, 8));
            case Difficult -> {
                map_size = new Vec2(rand.nextInt(8, 10), rand.nextInt(8, 10));
                depth = 2;
            }
            default -> map_size = new Vec2();
        }

        // Cut edges
        boolean[][] map_shape = new boolean[map_size.x][map_size.y];
        for (boolean[] b : map_shape) {
            Arrays.fill(b, true);
        }
        for (int i = 0; i < map_shape.length; i++) {
            for (int j = 0; j < map_shape[0].length; j++) {
                if(i > depth - 1 && i < map_shape.length - depth && j > depth - 1 && j < map_shape[0].length - depth){
                        j = map_shape[0].length - depth;
                }
                map_shape[i][j] = rand.nextBoolean();
            }
        }
        Map ret = new Map(map_shape);
        boolean[][] piece_layout = Array.MatrixCopyOf(map_shape);
        ArrayList<Vec2> EmptySlots = new ArrayList<>();

        for (int i = 0; i < piece_layout.length; i++) {
            for (int j = 0; j < piece_layout[i].length; j++) {
                if(piece_layout[i][j]){
                    EmptySlots.add(new Vec2(i, j));
                }
            }
        }

        while (EmptySlots.size() > 0){
            Collections.shuffle(EmptySlots);
            Vec2 selected = EmptySlots.get(0);
            int size = rand.nextInt(1, 4);
            boolean[][] shape = new boolean[size][size];
            for(int i = 0; i < size; i++){
                for (int j = 0; j < size; j++) {
                    Vec2 checked = new Vec2(i, j).add(selected);
                    if(EmptySlots.contains(checked)){
                        EmptySlots.remove(checked);
                        piece_layout[checked.x][checked.y] = false;
                        shape[i][j] = true;
                    }
                }
            }
            ret.addPiece(new Piece(shape));
        }

        //generate pieces
        return ret;
    }
}
