#!/usr/bin/env perl
########################################################################
# housekeeping
########################################################################
package Installer;
use v5.40;

use File::Basename        qw( basename dirname );
use File::Path            qw( make_path        );
use File::Spec::Functions qw( abs2rel catfile rel2abs );

########################################################################
# locate project root and install paths
########################################################################

my $bin_d  = rel2abs dirname $0;
my $test_d = dirname $bin_d;
my $work_d = dirname $test_d;

my $perl_t = catfile $bin_d, 'install-tests.d', '02-perl_t';
my $dest_d = catfile $test_d, '02-syntax';

chdir $work_d
or die "chdir '$work_d': $!";

-e $perl_t
or die "Missing template: $perl_t";

make_path $dest_d;

########################################################################
# remove stale symlinks
########################################################################

for my $old ( glob catfile $dest_d, '*.t' )
{
    unlink $old
    or die "unlink '$old': $!";

    say "Removed: $old";
}

########################################################################
# create symlinks for each Perl file found
# two-pass: file(1) for most cases; grep shebang for scripts that
# file(1) misidentifies (e.g. "#!/bin/env perl" triggers REXX heuristic)
########################################################################

my $target = abs2rel $perl_t, $dest_d;

my %seen;
my @perl_paths
= grep { ! $seen{ $_ }++ }
  grep { ! m{^ (?: blib | version ) /}x }
  grep { /\S/ }
  map  { chomp; $_ }
  (
    qx{ find * -type f 2>/dev/null | xargs file 2>/dev/null | grep '[Pp]erl' | cut -d: -f1 }
  , qx{ grep -rl '#!.*perl' . 2>/dev/null | sed 's|^\\./||' }
  , qx{ find * -type f \\( -name '*.pm' -o -name '*.pl' \\) 2>/dev/null }
  );

for my $path ( @perl_paths )
{
    my $base = join '~', split '/', $path;
    my $link = catfile $dest_d, "$base.t";

    symlink $target, $link
    or do
    {
        warn "symlink '$target' '$link': $!";
        next
    };

    say $link;
}
