import fs from "fs-extra";
import fp from "lodash/fp.js";
import _ from "lodash";

export const processInput = (input) =>
  fs.readFile(input, "utf8").then((content) => {
    let [coords, instructions] = content.split("\n\n");

    let grid = [];

    for (const [y, x] of coords
      .split("\n")
      .map((line) => line.split(",").map((x) => parseInt(x)))) {
      if (!grid[x]) grid[x] = [];
      grid[x][y] = true;
    }

    grid = [...grid].map((x) => (x ? [...x] : []));

    instructions = instructions
      .split("\n")
      .filter((x) => x)
      .map((line) => line.match(/([xy])=(\d+)/))
      .map(([_, direction, level]) => [direction, parseInt(level)]);

    return {
      grid,
      instructions,
    };
  });

export function foldGrid(grid, direction, level) {
  if (direction === "x") {
    for (const row of grid) {
      if (!row) continue;
      const folded = row.splice(level);
      folded.forEach((v, i) => {
        if (i === 0) return;
        if (!v) return;
        row[level - i] = v;
      });
    }

    return grid;
  }

  const folded = grid.splice(level);
  folded.forEach((v, i) => {
    if (i === 0) return;
    if (!v) return;
    grid[level - i] = _.range(
      _.max([grid[level - i].length, folded[i].length])
    ).map((j) => grid[level - i][j] || folded[i][j]);
  });

  return grid;
}

export function printGrid(grid) {
  return grid
    .map((line) => (line || []).map((x) => (x ? "#" : ".")).join(""))
    .join("\n");
}

export function solution({ grid, instructions }) {
  foldGrid(grid, ...instructions.shift());

  return _.sum(grid.flat());
}