use strict;
use warnings;
use alienfile;

configure {
    requires 'Alien::Meson';
    requires 'Carp';
    requires 'File::Copy::Recursive';
    requires 'HTTP::Tiny';
    requires 'Path::Tiny';
};

## not doing system install, so must deal with the package name
## being not obvious
plugin 'PkgConfig' => ( pkg_name => 'edlib-1', );

share {
    use Carp;
    use File::Copy::Recursive qw(dircopy);
    use HTTP::Tiny;
    use Path::Tiny;

    my $install_root;
    my $path_to_static_lib;
    my $repo_url;
    my $repo_response;

    ## use one of two locations to source edlib
    $repo_url =
      'https://github.com/Martinsos/edlib/archive/refs/heads/master2.zip';
    $repo_response = HTTP::Tiny->new->head($repo_url);
    unless ( $repo_response->{success} )
    {    ## failed original download, try my fork
        $repo_url =
          'https://github.com/chrisarg/edlib/archive/refs/heads/master.zip';
        $repo_response = HTTP::Tiny->new->head($repo_url);
        croak "Failed to download edlib from either location"
          unless $repo_response->{success};
    }

    start_url $repo_url;
    plugin 'Download';
    plugin 'Extract' => 'zip';
    plugin 'Build::CMake';
    plugin 'Gather::IsolateDynamic';

    ## build the dynamic library first and the dynamically linked
    ## executables (which will be overwritten afterwards)
    build [
        [
            '%{cmake}',
            @{ meta->prop->{plugin_build_cmake}->{args} },
            '-DBUILD_SHARED_LIBS=on',
            '-D CMAKE_BUILD_TYPE=Release',
            '-Wno-dev',
            '%{.install.extract}',
        ],
        ['%{make}'],
        ['%{make} install'],

        ## build the static library and the (statically linked)
        ## executables
        [
            '%{cmake}',
            @{ meta->prop->{plugin_build_cmake}->{args} },
            '-DBUILD_SHARED_LIBS=off',
            '-D CMAKE_BUILD_TYPE=Release',
            '-Wno-dev',
            '%{.install.extract}',
        ],
        ['%{make}'],
        ['%{make} install'],
    ];

    ## various postbuild activities to facilitate the gathering of files
    after 'build' => sub {
        my ($build) = @_;
        ## move the bin directories into the final location
        ## this includes the suite of the edlib library
        if ( $build->meta_prop->{destdir} ) {
            my $destdir = $ENV{DESTDIR};
            $install_root =
              Path::Tiny->new( $ENV{DESTDIR}, $build->install_prop->{prefix} );
        }
        else {
            $install_root = Path::Tiny->new( $build->install_prop->{stage} );
        }
        my $source_directory      = $build->{install_prop}->{extract};
        my $binary_dest_directory = path $install_root, 'bin';
        dircopy( path( $source_directory, 'bin' ), $binary_dest_directory );
        my $hw_exec = $^O eq 'MSWin32' ? 'helloWorld.exe' : 'helloWorld';
        $hw_exec = path( $binary_dest_directory, $hw_exec );
        unlink($hw_exec) if -e $hw_exec;

        $build->runtime_prop->{command} = 'edlib-aligner'
          if $^O ne 'MSWin32';

    };

    test sub {
        my ($build) = @_;
        my $binary_dest_directory =
          path( $build->install_prop->{stage}, 'bin' );
        my $runTests_exec = $^O eq 'MSWin32' ? 'runTests.exe' : 'runTests';
        $runTests_exec = path( $binary_dest_directory, $runTests_exec );
        print("Can't find test executable") if not -e $runTests_exec;
        my $test_output = `$runTests_exec`
          || die "failed to run edlib library tests";
        if (   $test_output =~ /FAIL/m
            || $test_output !~ /All specific tests passed/m )
        {
            die "edlib run time tests failed!";
        }
        unlink $runTests_exec;
    };
};



