#!/usr/bin/perl -w

use strict;
use Data::Dumper;
use File::Basename;
use Getopt::Long qw(:config bundling no_ignore_case);
use HTTP::Request::Common;
use LWP::UserAgent;
use Mojo::DOM;

$|=1;

my %cfg = (
            url     => '',
	    dd_list => '/usr/bin/dd-list',
            debug   => 0,
            verbose => 0,
            help    => 0,
          );

my $result = GetOptions(
                         'u|url=s'     => \$cfg{url},
                         'D|dd-list=s' => \$cfg{dd_list},
                         'd|debug'     => \$cfg{debug},
                         'v|verbose'   => \$cfg{verbose},
                         'h|help'      => \$cfg{help},
                       );

if(!$result || $cfg{help} || !$cfg{url}) {
	print STDERR "\n" if(!$result);

	print "Usage: ". basename($0) ." [OPTIONS]\n\n";
	print "Options:\n";
	print "-u, --url <URL>       URL to transition tracker\n";
	print "-D, --dd-list <PATH>  Path to dd-list executable\n";
	print "-d, --debug           Enable debug output\n";
	print "-v, --verbose         Enable verbose output\n";
	print "-h, --help            Display this usage information\n";

	exit 1;
}

my $ua = new LWP::UserAgent(agent => basename($0));

print "Retrieving $cfg{url}\n" if($cfg{verbose});

my $req = new HTTP::Request(GET => $cfg{url});

my $res = $ua->request($req);
if($res->is_success) {
	my $content = $res->content;

	my $dom = Mojo::DOM->new($content);

	my %packages = ();

	my %longest = (
	                name    => 0,
	                version => 0,
	              );

	(my $name = basename($cfg{url})) =~ s/^(?:auto-)?(.*?)\.html$/$1/;

	my %rename = (
	               'netcdf-c' => 'netcdf',
	             );

        $name = $rename{$name} if($rename{$name});

	my $dependency_level = 0;
	foreach my $tr ($dom->find('div.content table tr')->each) {
		if(
		    $tr->child_nodes->first->tag eq 'th' &&
		    $tr->child_nodes->first->text =~ /Dependency level/
		) {
			print "Skipping Dependency level\n" if($cfg{verbose});

			$dependency_level++;

			next;
		}

		my $name = $tr->child_nodes->first->child_nodes->first->text;

		if(!$name) {
			print STDERR "Error: Failed to find package name!\n";
			print STDERR $tr->content ."\n";
			exit 1;
		}

		my %package = (
		                name => $name,
		              );

		my $cells = $tr->find('td')->to_array;

		my $i = 0;
		foreach my $cell (@$cells) {
			if($i == 1) {
				# (<small><a href="https://packages.debian.org/changelog:proj">5.2.0-1</a></small>)
				if($cell->content =~ /\((.+?)\)/) {
					my $version = $1;

					if($version =~ /<a .*?>(\d+\S+?)<\/a>/) {
						$package{version} = $1;
					}
				}
				else {
					print STDERR "Error: Failed to find package version!\n";
					print STDERR $cell->content ."\n";
					exit 1;
				}
			}

			$i++;
		}	

		$packages{$dependency_level}{$name} = \%package;

		foreach my $key (keys %package) {
			my $length = length($package{$key});

			$longest{$key} = $length if($length > $longest{$key});
		}
	}

	$longest{version} += 2;

	print "packages:\n".Dumper(\%packages) if($cfg{debug});

	my @cmd = (
	            $cfg{dd_list},
	            '-i',
	          );

	open(DDLIST, '|-', @cmd) || die "Error: Failed to execute: @cmd ($!)";
	foreach my $dependency_level (sort keys %packages) {
		foreach my $package (sort keys %{$packages{$dependency_level}}) {
			print DDLIST "$package\n";
		}
	}
	close(DDLIST);
}
else {
	print STDERR "Error: Request failed! ($cfg{url})\n";
	print STDERR "HTTP Status: ".$res->code." ".$res->message."\n";
	print STDERR $res->content if($res->content);

	exit 1;
}

