/*
Spiral Matrix
https://leetcode.com/problems/spiral-matrix/description/

Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spiral order.

Example 1:

Input:
[
 [ 1, 2, 3 ],
 [ 4, 5, 6 ],
 [ 7, 8, 9 ]
]
Output: [1,2,3,6,9,8,7,4,5]
Example 2:

Input:
[
  [1, 2, 3, 4],
  [5, 6, 7, 8],
  [9,10,11,12]
]
Output: [1,2,3,4,8,12,11,10,9,5,6,7]
*/

/**
 * @param {number[][]} matrix
 * @return {number[]}
 */

var spiralOrder = function (matrix) {
  if (matrix.length === 0) return [];

  var retArray = [];
  const rowLength = matrix.length;
  const colLength = matrix[0].length;
  const countRectangles = Math.ceil(Math.min(colLength, rowLength) / 2);
  for (var i = 0; i < countRectangles; i++)
    printRect(matrix, i, rowLength, colLength, retArray);

  return retArray;
};

var printRect = function (matrix, i, rowLength, colLength, retArray) {
  const firstRow = i;
  const firstCol = i;
  const lastRow = rowLength - i - 1;
  const lastCol = colLength - i - 1;

  for (var col = firstCol; col <= lastCol; col++) {
    retArray.push(matrix[firstRow][col]);
  }
  for (var row = firstRow + 1; row <= lastRow; row++) {
    retArray.push(matrix[row][lastCol]);
  }
  if (firstRow === lastRow || firstCol === lastCol) {
    return;
  }
  for (col = lastCol - 1; col >= firstCol; col--) {
    retArray.push(matrix[lastRow][col]);
  }
  for (row = lastRow - 1; row > firstRow; row--) {
    retArray.push(matrix[row][firstCol]);
  }
};

module.exports.spiralOrder = spiralOrder;