use strict;
use warnings;

use lib "install_util";
use File::Spec;
use File::Basename;
use FindBin;
use Module::Build;
use Test::More 'no_plan';

use Capture::Tiny qw/ capture /;

compiles_ok( $_ ) for files_to_check();

############# subs ################

sub files_to_check {
    unless( -d 'cgi-bin' && -d 'bin' ) {
        chdir File::Spec->catfile( $FindBin::Bin, File::Spec->updir );
    }

    return
        map { glob "$_/*" }
        'cgi-bin', 'bin';
}

sub compiles_ok {
    my @abspath  = @_;
    my $basename = $abspath[-1];
    my $cat_path = File::Spec->catfile( @abspath );

  SKIP: {
        skip "explicitly skipping $cat_path", 1 if skip_file($cat_path);

        my ($stdout, $stderr) = capture {
            system $^X, '-cw', $cat_path
        };
        if ( $? == 0 ) {
            ok( 1, "$cat_path compiled ok" )
                or diag $stderr;
            like( $stderr, qr/syntax OK\n$/, qq|$cat_path stderr said "syntax OK"| )
                or diag $stderr;
        } elsif ( $stderr =~ /^Can't locate (\S+) in \@INC/ && missing_recommend($1) ) {
            ok( 1, "$cat_path does not compile due to missing recommend" );
        } else {
            ok( 0, "$cat_path compiled ok" );
            diag "stdout: $stdout";
            diag "stderr: $stderr";
        }
	chomp $stdout;
        is( $stdout, '', "$cat_path nothing on stdout" );
    }
}

my $missing_recommends;
sub missing_recommend {
    my $modname = shift;
    $modname =~ s/\.pm$//;
    $modname =~ s![\\/]!::!g;

    $missing_recommends 
	||= Module::Build->current->prereq_failures ?  Module::Build->current->prereq_failures->{recommends} 
                                                    :  {};
    return $missing_recommends->{$modname};
}


sub skip_file {
    my $file = shift;
    my %skip = map { $_ => 1 }
        qw(
           gbrowse_netinstall.pl
           gbrowse_netinstall2.pl
	   process_wormbase.pl
	   gbrowse_gmap
	   make_das_conf.pl
          );

    return $skip{ basename($file) };
}
