use alienfile;
use Path::Tiny qw( path );
use File::Glob qw( bsd_glob );
use Config;

my $windows_msvc = $^O eq 'MSWin32' && $Config{cc} =~ /cl(\.exe)?$/;
my $windows_gcc  = $^O eq 'MSWin32' && $Config{cc} !~ /cl(\.exe)?$/;

plugin 'Probe::CBuilder' => (
  libs    => '-lbz2',
  version => qr/version = '(.*?)[,']/,
  program => q{
#include <bzlib.h>
#include <stdio.h>

int main(int argc, char *argv[])
{
  printf("version = '%s'\n", BZ2_bzlibVersion());
  return 0;
}
},
);

plugin 'Probe::CommandLine' => (
  command   => 'bzip2',
  secondary => 1,
);

share {

  plugin 'Build::MSYS' => ();
  plugin 'Download' => (
    url     => 'http://www.bzip.org/downloads.html',
    version => qr/^bzip2-([0-9\.]+)tar.gz$/,
  );
  plugin Extract => 'tar.gz';
  
  if($windows_gcc)
  {
    requires 'Path::Tiny' => '0.077';
    patch sub {
      path('Makefile')->edit_lines(sub {
        s/(\Qchmod a+x\E.*?(bzip2|bunzip2|bzcat|bzip2recover))$/ $1 . '$(EXE)' /eg;
      });
      path('bzlib.h')->edit_lines(sub {
        if(/WINAPI func/)
        {
          $_ = join('', "#   ifdef BZ_STATIC\n",
                        "#   define BZ_API(func) func\n",
                        "#   else\n",
                        $_,
                        "#   endif\n");
        }
      });
    };
  }

  my @build;
  
  if($windows_msvc)
  {
    push @build, 
      [ 'nmake', -f => 'makefile.msc' ],
      sub {
        my($build) = @_;
        my $dest = path($build->install_prop->{prefix});
        my $bin  = $dest->child('bin');
        my $lib  = $dest->child('lib');
        my $inc  = $dest->child('include');
        
        $_->mkpath for ($bin,$lib,$inc);
        
        path($_)->copy($bin->child($_)) for bsd_glob '*.exe';
        path($_)->copy($lib->child($_)) for bsd_glob '*.lib';
        path($_)->copy($inc->child($_)) for 'bzlib.h';
      };
  }
  else
  {
    push @build,
      [ '%{make}', 'all', "CC=%{perl.config.cc}", "CFLAGS=%{perl.config.cccdlflags} %{perl.config.optimize}", ],
      [ '%{make}', 'install', 'PREFIX=%{alien.install.prefix}', 'EXE=%{perl.config.exe_ext}' ];
  }

  push @build, sub {
    my($build) = @_;
    my($version) = path(".")->absolute->basename =~ /([0-9\.]+)$/;
    $build->runtime_prop->{version} = $version;
  };
  
  if($^O !~ /^(MSWin32|cygwin|msys)$/)
  {
    push @build, [ '%{make}', -f => 'Makefile-libbz2_so', sub {
    
      my($build, $det) = @_;
      
      if($det->{exit} == 0)
      {
        my @dlls = grep { ! -l $_ } bsd_glob 'libbz2*.so*';
        my $dest = path($build->install_prop->{prefix})->child('dynamic');
        $dest->mkpath;
        path($_)->copy($dest->child($_))
          for @dlls;
      }
    }];
  }
  
  build \@build;

  gather sub {
    my($build) = @_;
    my $prefix = $build->runtime_prop->{prefix};

    $build->runtime_prop->{cflags}        = "-I$prefix/include ";
    $build->runtime_prop->{cflags_static} = "-I$prefix/include ";

    if($windows_msvc)
    {
      $build->runtime_prop->{cflags_static} .= ' -DBZ_STATIC=1' if $windows_gcc;
      $build->runtime_prop->{libs}          = "-LIBPATH:$prefix/lib libbz2.lib ";
      $build->runtime_prop->{libs_static}   = "-LIBPATH:$prefix/lib libbz2.lib ";
    }
    else
    {
      $build->runtime_prop->{cflags_static} .= ' -DBZ_STATIC=1' if $windows_gcc;
      $build->runtime_prop->{libs}          = "-L$prefix/lib -lbz2 ";
      $build->runtime_prop->{libs_static}   = "-L$prefix/lib -lbz2 ";
    }
  };

};
