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

export const processInput = (filename) => fs.readFile(filename,'utf8').then(
    content => content.split("\n").filter(x=>x).map(
        lines => lines.split('').map(x => parseInt(x))
    )
);

export const genNeighbours = (maxX,maxY) => (x,y) =>
    [ [-1,0], [1,0], [0,1], [0,-1] ].map(
        delta => _.zip(delta,[x,y]).map(_.sum)
    ).filter( ([x,y]) => {
        if(x<0 || y<0 ) return false;
        if( x>= maxX || y>= maxY ) return false;
        return true;
    } );

export const genCoords = grid => ([x,y]) => grid[x][y];

export function solution(grid) {
    const seen = grid.map( () => [] );
    let risk = 0;

    const neighbours = genNeighbours(grid.length,grid[0].length);
    const coords = genCoords(grid);

    for( const x of _.range(grid.length) ) {
        for( const y of _.range(grid[x].length) ) {
            if( seen[x][y] ) continue;

            let lowest = true;
            for( const n of neighbours(x,y) ) {
                if( coords(n) > grid[x][y] ) {
                    seen[n[0]][n[1]] = true;
                } else if ( coords(n) == grid[x][y] ) {
                    seen[n[0]][n[1]] = true;
                    lowest = false;
                } else {
                    lowest = false;
                }
            }

            if(lowest) {
                risk += 1 + grid[x][y];
            }
            seen[x][y] = true;

        }
    }

    return risk;
}