use alienfile;

configure { requires 'Alien::Build' => '0.99' };

probe sub {
  if($^O eq 'MSWin32' || $ENV{PERL_ALIEN_MSYS_FAUX})
  {
    return 'share'
      if defined $ENV{ALIEN_MSYS_INSTALL_TYPE} && $ENV{ALIEN_MSYS_INSTALL_TYPE} eq 'share';
  
    if(-f 'lib/Alien/MSYS.pm')
    {
      eval { require './lib/Alien/MSYS.pm' };
    }
    else
    {
      eval { require Alien::MSYS };
    }
    if(my $error = $@)
    {
      log("error loading Alien::MSYS: $error");
    }
    else
    {
      do { no warnings 'redefine'; *Alien::MSYS::_my_dist_dir = sub {} };
      if(defined Alien::MSYS::msys_path())
      {
        return 'system';
      }
    }
    die "requested a system install, but could not be found!"
      if defined $ENV{ALIEN_MSYS_INSTALL_TYPE} && $ENV{ALIEN_MSYS_INSTALL_TYPE} eq 'system';
    return 'share';
  }
  else
  {
    return 'system';
  }
};

share {

  meta->prop->{start_url} = 'https://sourceforge.net/projects/mingw/files/Installer/mingw-get/';

  requires 'Path::Tiny';
  plugin 'Fetch::HTTPTiny';
  plugin 'Decode::HTML';
  plugin 'Decode::SourceForge';
  plugin 'Extract' => 'zip';

  download sub {
    my($build) = @_;

    $build->log("GET @{[ meta->prop->{start_url} ]}");
    
    my $mingw_get_index_url = do {
      my $ret = $build->decode($build->fetch);
      my($first) = grep { $_->{filename} =~ /mingw-get-.*?-([0-9]{8})-([0-9]+)/ } @{ $ret->{list} };
      die 'unable to find the correct directory for mingw-get' unless $first;
      $first->{url};
    };
    
    $build->log("GET $mingw_get_index_url");
    
    my $mingw_get_url = do {
      my $ret = $build->decode($build->fetch($mingw_get_index_url));
      my($first) = grep { $_->{filename} =~ /mingw-get-.*?-bin.zip/ } @{ $ret->{list} };
      $first->{url};
    };
    
    $build->log("GET $mingw_get_url");
    
    do {
      my $ret = $build->fetch($mingw_get_url);
      
      if(defined $ret->{content})
      {
        Path::Tiny->new($ret->{filename})->spew_raw($ret->{content});
      }
      elsif(defined $ret->{path})
      {
        my $from = Path::Tiny->new($ret->{path});
        my $to   = $ret->{filename};
        if($ret->{tmp})
        {
          $from->move($to);
        }
        else
        {
          $from->copy($to);
        }
      }
      else
      {
        die 'get did not return a file';
      }
      
    };

  };

  meta->around_hook(
    build => sub {
      my $orig = shift;
    
      use Env qw( @PATH );
      local $ENV{PATH} = $ENV{PATH};
      unshift @PATH, Path::Tiny->new('./bin')->absolute->stringify;

      foreach my $dll (grep { $_->basename =~ /\.dll$/ } Path::Tiny->new('libexec/mingw-get')->children)
      {
        eval { chmod 0755, $dll };
      }

      $orig->(@_);
    },
  );

  build [
    'mingw-get install msys',
    'mingw-get install msys-m4',
    'mingw-get install msys-perl',
    sub {
      my($build) = @_;
      my $move = 'move';

      if($^O eq 'cygwin')
      {
        $build->system('mv * %{.install.stage}');
      }
      elsif($^O eq 'MSWin32')
      {
        my $stage = File::Spec->catdir($build->install_prop->{stage});
        $build->system("xcopy . $stage /E");
      }
      else
      {
        die "huh?";
      }
    },
  ];

};
