package examples.maze;


public class MazeGenerator {
  private final char space = '.';
  private final char wall = '#';
  private final char start = 'S';
  private final char end = 'E';
  private char maze[][] = null;
  private static int a = 20;
  private static int d = 20;

  public void markStart(java.awt.Point p) {
    getMaze()[p.x][p.y] = getStart();
  }

  public int frand(int s, int e) {
    return s + (int) (Math.random() * (e - s));
  }

  public void markEnd(java.awt.Point p) {
    getMaze()[p.x][p.y] = getEnd();
  }

  public MazeGenerator(int w, int h) {
    setMaze(new char[w][h]);
    init();
  }

  public static void main(String args[]) {
    int x = (int) (Math.random() * 10) + (int) (Math.random() * 10);
    int y = (int) (Math.random() * 10);

    MazeGenerator mg = new MazeGenerator(getA(), getD());

    mg.markStart(new java.awt.Point(1, 1));
    mg.markEnd(new java.awt.Point((getA() - 2), getD() - 2));
    mg.print(mg.getStringArray());

    String mazeString[] = mg.getStringArray();

    MazeUtility.setMazeString(mazeString);
    MazeUtility.solve();
    MazeUtility.print();
  }

  public void init() {
    fillWithSpaces();
    addWall3();
    addWall2();
    addWall1();
    addWall0();
    addinnerwalls();

  }

  public void addWall1() {
    for (int y = 0; y < getMaze().length; y++)
      getMaze()[y][getMaze()[0].length - 1] = getWall();
  }

  public void addWall2() {
    for (int x = 0; x < getMaze()[0].length; x++)
      getMaze()[getMaze().length - 1][x] = getWall();
  }

  public void addWall3() {
    for (int y = 0; y < getMaze().length; y++)
      getMaze()[y][0] = getWall();
  }

  public void addWall0() {
    for (int x = 0; x < getMaze()[0].length; x++)
      getMaze()[0][x] = getWall();
  }

  public void fillWithSpaces() {
    for (int r = 0; r < getMaze().length; r++)
      for (int col = 0; col < getMaze()[r].length; col++)
        getMaze()[r][col] = getSpace();
  }

  public void addinnerwalls() {
    for (int r = 0; r < getMaze().length - 1; r++) {
      int x = (int) (Math.random() * 10 + 1);
      int y = (int) (Math.random() * 10 + 1);
      getMaze()[x][y] = getWall();

      for (int col = 0; col < getMaze()[r].length - 1; col++)
        getMaze()[x + (getA() - 12)][y] = getWall();

      for (int col = 0; col < getMaze()[r].length - 1; col++)
        getMaze()[x][y + (getA() - 12)] = getWall();

      for (int col = 0; col < getMaze()[r].length - 1; col++)
        getMaze()[x + (getA() - 12)][y + (getA() - 12)] = getWall();

      for (int col = 0; col < getMaze()[r].length - 1; col++)
        getMaze()[x][y] = getWall();

      for (int col = 0; col < getMaze()[r].length - 1; col++)
        getMaze()[x][y] = getWall();

      if (getA() > 20)
        for (int col = 0; col < getMaze()[r].length - 1; col++) {
          for (int z = 5; z < 26; z++) {
            getMaze()[15][z] = getWall();
            getMaze()[z][15] = getWall();
            getMaze()[z - 1][16] = getWall();
            getMaze()[16][z - 1] = getWall();
          }
        }

    }
  }

  public String[] getStringArray() {
    String s[] = new String[getMaze().length];
    for (int r = 0; r < getMaze().length; r++)
      s[r] = new String(getMaze()[r]);
    return s;
  }

  public void print(String a[]) {
    for (int i = 0; i < a.length; i++)
      System.out.println(a[i]);
  }

  public void print() {
    for (int r = 0; r < getMaze().length; r++) {
      System.out.println();
      for (int col = 0; col < getMaze()[r].length; col++)
        System.out.print(getMaze()[r][col]);
    }
  }

  public char getSpace() {
    return space;
  }

  public char getWall() {
    return wall;
  }

  public char getStart() {
    return start;
  }

  public char getEnd() {
    return end;
  }

  public char[][] getMaze() {
    return maze;
  }

  public void setMaze(char[][] maze) {
    this.maze = maze;
  }

  public static int getA() {
    return a;
  }

  public static void setA(int a) {
    MazeGenerator.a = a;
  }

  public static int getD() {
    return d;
  }

  public static void setD(int d) {
    MazeGenerator.d = d;
  }
}