package P2;

use 5.20.0;
use warnings;

use List::AllUtils qw/ /;
use Math::Vector::Real;

require './part1.pm';

use Moose;
extends 'P1';

use experimental qw/ signatures postderef /;

sub neighbours ( $self, $i, $j, $grid ) {

    my $n = 0;

    for my $x ( -1, 0, 1 ) {
        for my $y ( -1, 0, 1 ) {
            next unless $x or $y;

            my $delta = V( $x, $y );
            my $c     = V( $i, $j );

            while () {
                $c += $delta;

                last if grep { $_ < 0 } @$c;
                my $x = $grid->[ $c->[0] ][ $c->[1] ];

                last if !$x or $x eq 'L';

                next if $x eq '.';

                $n++;
                last;
            }
        }
    }

    return $n;

}

sub iterate ( $self, $room ) {

    my @grid = map { [ split '' ] } split "\n", $room;
    my @next = map { [@$_] } @grid;

    for my $i ( 0 .. $#grid ) {
        my $row = $grid[$i];
        for my $j ( 0 .. $row->$#* ) {
            if ( $row->[$j] eq 'L' ) {
                if ( not $self->neighbours( $i, $j, \@grid ) ) {
                    $next[$i][$j] = '#';
                }
            }
            elsif ( $row->[$j] eq '#' ) {
                if ( $self->neighbours( $i, $j, \@grid ) >= 5 ) {
                    $next[$i][$j] = 'L';
                }
            }
        }
    }

    return join "\n", map { join '', @$_ } @next;
}

1;