/**
 * p5.js example of HackforPlay
 * (c) teramotodaiki 2016
 * MIT License
*/

// See ---- http://p5js.org
var p5 = require('https://cdnjs.cloudflare.com/ajax/libs/p5.js/0.5.3/p5.min.js');

new p5();
pixelDensity(1);
Hack.view = canvas;
resizeCanvas(720, 400);

module.exports = function (tileSize) {

  w = tileSize;
  // Calculate columns and rows
  columns = floor(width/w);
  rows = floor(height/w);

  // Wacky way to make a 2D array is JS
  board = new Array(columns);
  for (var i = 0; i < columns; i++) {
    board[i] = new Array(rows);
  }
  // Going to use multiple 2D arrays and swap them
  next = new Array(columns);
  for (i = 0; i < columns; i++) {
    next[i] = new Array(rows);
  }

  window.draw = draw;
  window.mousePressed = mousePressed;
  init();

};



/**
 * Game of Life
 * https://p5js.org/examples/examples/Simulate_Game_of_Life.php
 * p5.js was created by Lauren McCarthy and is developed by a community of collaborators,
 * with support from the Processing Foundation and NYU ITP. © Info.
*/

var w;
var columns;
var rows;
var board;
var next;

w = 20;
// Calculate columns and rows
columns = floor(width/w);
rows = floor(height/w);
// Wacky way to make a 2D array is JS
board = new Array(columns);
for (var i = 0; i < columns; i++) {
  board[i] = new Array(rows);
}
// Going to use multiple 2D arrays and swap them
next = new Array(columns);
for (i = 0; i < columns; i++) {
  next[i] = new Array(rows);
}
init();

function draw() {
  background(255);
  generate();
  for ( var i = 0; i < columns;i++) {
    for ( var j = 0; j < rows;j++) {
      if ((board[i][j] == 1)) fill(0);
      else fill(255);
      stroke(0);
      rect(i*w, j*w, w-1, w-1);
    }
  }
}

// reset board when mouse is pressed
function mousePressed() {
  init();
}

// Fill board randomly
function i
) {
  for (var i = 0; i < columns; i++) {
    for (var j = 0; j < rows; j++) {
      // Lining the edges with 0s
      if (i == 0 || j == 0 || i == columns-1 || j == rows-1) board[i][j] = 0;
      // Filling the rest randomly
      else board[i][j] = floor(random(2));
      next[i][j] = 0;
    }
  }
}

// The process of creating the new generation
function generate() {

  // Loop through every spot in our 2D array and check spots neighbors
  for (var x = 1; x < columns - 1; x++) {
    for (var y = 1; y < rows - 1; y++) {
      // Add up all the states in a 3x3 surrounding grid
      var neighbors = 0;
      for (var i = -1; i <= 1; i++) {
        for (var j = -1; j <= 1; j++) {
          neighbors += board[x+i][y+j];
        }
      }

      // A little trick to subtract the current cell's state since
      // we added it in the above loop
      neighbors -= board[x][y];
      // Rules of Life
      if      ((board[x][y] == 1) && (neighbors <  2)) next[x][y] = 0;           // Loneliness
      else if ((board[x][y] == 1) && (neighbors >  3)) next[x][y] = 0;           // Overpopulation
      else if ((board[x][y] == 0) && (neighbors == 3)) next[x][y] = 1;           // Reproduction
      else                                             next[x][y] = board[x][y]; // Stasis
    }
  }

  // Swap!
  var temp = board;
  board = next;
  next = temp;
}

nit(