#!/usr/bin/perl

use strict;
use warnings;

use LWP::Simple;
use Cwd;
use Getopt::Std;

our ($opt_l,$opt_d);
getopts('ld') or die "unknown opt";

# clean out environment
delete $ENV{JHC_PATH};
delete $ENV{JHC_OPTS};
delete $ENV{JHC_CACHE};
delete $ENV{JHC_LIBRARY_PATH};

my $tmpdir = "tmp/build";

mkdir "tmp";
mkdir "tmp/build";

sub mysystem {
    print( (join " ", @_), "\n");
    system @_ and die "Running Command Failed!";
}

foreach my $fn (@ARGV) {
    next unless $fn =~ /\.(cabal|yaml)$/;
    my $patch = $fn;
    $patch =~ s/\.(cabal|yaml)$/.patch/;
    print "Processing $fn\n" unless $opt_l;
    open my $fh, "<", $fn or die "$!: $fn";
    my ($name,$version,$options);
    $options = "";
    while(<$fh>) {
        $name = $1 if /^name:\s*(.*?)\s*$/i;
        $version = $1 if /^version:\s*(.*?)\s*$/i;
        $options = $1 if /^options:\s*(.*?)\s*$/i;
    }
    next unless $name;
    next unless $version;

    $options = "$options --stop deps --deps tmp/$name-deps.yaml" if $opt_d;

    print("$name-$version.hl\n"),next if $opt_l;

    print "Processing $fn, found $name-$version\n";
    my $url = "http://hackage.haskell.org/packages/archive/$name/$version/$name-$version.tar.gz";
    print "Fetching $url\n";
    unless(-e "$tmpdir/$name-$version.tar.gz") {
        my $rc = getstore($url, "$tmpdir/$name-$version.tar.gz");
        if (is_error $rc) { die "$url: $rc" } ;
    }
    mysystem "tar -zxv --directory $tmpdir -f $tmpdir/$name-$version.tar.gz" and die "$!: tar";
    my $src = -d "$tmpdir/$name-$version/src" ? "/src" : "";
    mysystem "patch -d $tmpdir/$name-$version -p1 < $patch" if -e $patch;
    mysystem("cp '$fn' '$tmpdir/$name-$version'");
    $fn =~ s/.*\///;
    mysystem("./jhc $options " . ($ENV{JHC_TEST} || "") .
        " --build-hl '$tmpdir/$name-$version/$fn' -L- -L. -i- '-i$tmpdir/$name-$version$src'") and die "$!: jhc";
}
