#!/usr/bin/perl -w

use strict;
use AptPkg::Config '$_config';
use AptPkg::System '$_system';
use AptPkg::Cache;
use HTTP::Request;
use Data::Dumper;

(my $self = $0) =~ s#.*/##;

sub getLocalyInstalled {
  my %res;

  foreach my $source (@_) {
    print "processing \"$source\"\n";
    open(DPKG, $source) or die "Can't open source \"$source\": $!";
    while (my $line = <DPKG>) {	
      chomp($line);
      if ($line =~ /^(\S+)\s+(\S+)$/) {
	if ($2 eq 'install') {
	  $res{$1}=[];
	} elsif ($2 eq 'hold') {
	  $res{$1}=[];
	} elsif ($2 eq 'deinstall') {
	} else {
	  die "Unknown state of the package \"$1\": $2\n";
	};
      };
    };
    close(DPKG);
  };

  return %res;
};

my $prefixDir = $ARGV[0] or die "No storage directory passed to program";

$| = 1;

$_config->{quiet} = 2;
$_config->init;
$_system = $_config->system;
my $cache = AptPkg::Cache->new;
my @sources = ('dpkg --get-selections|',
	       '</home/semik/.selections/selections.off-line');
my %packages = getLocalyInstalled(@sources);

foreach my $file (@{$cache->files}) {
  if (($file->{IsOk}==1) and ($file->{IndexType} eq 'Debian Package Index')) {
    if (open(FILE, "<".$file->{FileName})) {
      my $get = 0;
      my $package = '';
      while (my $line = <FILE>) {
	chomp($line);
	if ($line =~ /^Package: (.*)/) {
	  if (defined($packages{$1})) {
	    $package = $1;
	    $get=1;
	  };
	} elsif (($line =~ /^Filename: (.*)/) and ($get==1)) {
	  $get = 0;
	  my $FileName = $1;
	  my $aptPackagesList = $file->{FileName};
	  my $site = $file->{Site};
	  $aptPackagesList =~ s/_Packages$//;
	  $aptPackagesList =~ s/^.*$site\_//;
	  $aptPackagesList =~ s/\_/\//g;
	  $aptPackagesList =~ s/\/dists.*//;
	  #print "$aptPackagesList\n";
	  #print "$FileName\n";
	  my $url = "http://".$file->{Site}."/$aptPackagesList/$FileName";
	  #print "$url\n";
	  push @{$packages{$package}}, $url;
	};
      };
      close(FILE);
    };
  };
};

foreach my $package (sort keys %packages) {
  print "$package: "; 
  foreach my $url (@{$packages{$package}}) {
    `wget --quiet -c -x -P $prefixDir $url`; 
    print "."; 
  };
  print "\n";
};


__END__

foreach my $package (@packages) {
  print ">>>$package\n";
  my $p = $cache->{$package};
  if ($p) {
    my $available = $p->{VersionList};
    my $i = 0;
    for my $v (@$available) {
      if (scalar(@{$v->{FileList}}) >= 2) {
	my $f = $v->{FileList}->[0]->{File}{FileName};
	open(F, $f) or die "Can't open file \"$f\": $!";
	my $search = 0;
	while (my $line = <F>) {
	  my $Package = $package;
	  $Package =~ s/\+/\\\+/;
	  $search = 1 if ($line =~ /^Package: $Package$/);
	  if ($search and ($line =~ /^Filename: (.*)$/)) {
	    my $uri = $1;
	    $f =~ s/\/var\/lib\/apt\/lists\//http:\/\//;
	    $f =~ s/_debian_.*/\/debian\/$uri/;
	    $f =~ s/_dists.*/\/$uri/;
	    $f =~ s/_local(.*)$/\/local$1/;
	    $f =~ s/_debian-non-US(.*)$/\/debian-non-US$1/;
	    print "$f ...";
	    #`wget --quiet -c -x -P $prefixDir $f`;
	    print "\n";
	    $search=0;
	    seek(F, 0, 2);
	  };
	};
      } else {
	# baliky co byly ale uz nejsou nainstalovany
      };	
      $i++;
    };
  } else {
    warn "$self: don't know anything about package `$package'\n";
    next;
  };
};


