#!/usr/bin/perl

#use strict;

use File::Path;
use File::Basename;
use LWP::Simple;
require Digest::MD5;

my @PARTS = ("main", "contrib", "non-free", "non-US/main", "non-US/contrib",
            "non-US/non-free");

#my @PARTS = ("non-free");

my $DISTR       = "testing";
my $MIRRORDIR   = "debian";
my $MIRROR      = "http://ftp.uk.debian.org/debian";
my $EXCLUDEFILE = "exclude";

my @APackages;
my @Excludes; 

sub getPackages {
    foreach my $part (@PARTS){
       my $dir = "dists/$DISTR/$part/binary-i386";
       getFile("$MIRROR/$dir/Packages.gz", "$MIRRORDIR/$dir/Packages.gz");
       `zcat $MIRRORDIR/$dir/Packages.gz > $MIRRORDIR/$dir/Packages`;
    }
}



sub readPackages {
    my $i=0;
    foreach my $part (@PARTS){
       my $dir = "dists/$DISTR/$part/binary-i386";

       my $rec = {};
       open(PACK,"<$MIRRORDIR/$dir/Packages") or die "cant open file $MIRRORDIR/$dir/Packages\n"; 
       while(<PACK>){
            chomp;
            my $L = $_;
            if($L eq ""){
                push @APackages, $rec;
                $rec = {};
                next;
            }
            if($L =~ /^ .*$/){
                next;
            }
            my ($key, $value) = split /: /, $L;
            $rec->{$key} = $value;
            
       }
       close(PACK);
    }
}

sub readExcludes {
    open(FD,$EXCLUDEFILE) or die "can't open $EXCLUDEFILE\n";
    while(<FD>){
        chomp;
        push @Excludes, $_;
    }
    close(FD); 
}

sub printAPackage {
    for my $href (@APackages){
        print "{ \n";
        for my $key ( keys %$href ){
            print "\t$key=$href->{$key}\n";
        }
        print "}\n";
    }
}

sub getFile {
    my $url=$_[0];
    my $file=$_[1];
    my $dir = dirname($file);
    mkpath([$dir]);
    print "Getting: $file\n";
    getstore($url, $file);
    
}

sub md5Check {
    my $file = $_[0];
    my $MD5sum = $_[1];
    open(FILE, "$MIRRORDIR/$file") or die "cant open $MIRRORDIR/$file\n";
    binmode(FILE);
    my $md5file = Digest::MD5->new()->addfile(*FILE)->hexdigest;
    close(FILE);
    if($MD5sum ne $md5file){
        print "MD5sum not correct for $file\n";
        return 0;
    } else {
        #print "file $file is ok\n";
        return 1;
    }
}


sub inExcludes {
    my $file = $_[0];
    foreach my $pat (@Excludes){
        return 1 if $file =~ /$pat/;
    }
    return 0;
}

sub rmOldfiles {
    my $path = $_[0];
    my $fname = basename($path);
    my $pat = basename($path);
    my $dir = dirname($path);
    $pat =~ s/_.*\.deb//g;
    $pat =~ s/\+/\\+/g;
    $pat .= "_";
    opendir DIR, $dir;
    my @delfiles = grep { $fname ne $_ } grep { /^$pat/ } readdir(DIR);
    closedir DIR;
    if(int(@delfiles)){
        foreach my $f (@delfiles){
            print "Delete : $dir/$f\n"; 
            my $d = unlink("$dir/$f");
            print "File $dir/$f not deleted: $!\n" if $d != 1;
        }
    }
}


sub getFiles {
    for my $href (@APackages){
        my $need2get = 1; 
        my $file = $href->{Filename};
        my $package = $href->{Package};
        print "\nPackage: $package\n";
        if(-e("$MIRRORDIR/$file")){         # check if file exists...
            if(md5Check($file, $href->{MD5sum})){
                print "File: ". basename($file) ." is ok\n";
                $need2get = 0;
            }
        } else {
                #print "file $MIRRORDIR/$file not found\n";   
        };
        &rmOldfiles("$MIRRORDIR/$file");
        if(inExcludes("$file")){
            print "File: ". basename($file) ." in excludes - skiping\n";
            &rmOldfiles("$MIRRORDIR/$file.rmme.deb");
            $need2get = 0;
        }
        if(!$need2get){
            next;
        }
        &getFile("$MIRROR/$file", "$MIRRORDIR/$file");
        
    }
}

&getPackages;
&readPackages;
&readExcludes;
&getFiles;


#while (<STDIN>){
#    chomp;
#    my $path = $_;
#    my $fname = basename($path);
#    my $pat = basename($path);
#    my $dir = dirname($path);
#    $pat =~ s/_.*\.deb//g;
#    $pat =~ s/\+/\\+/g;
#    $pat .= "_";
#    print "fname: $fname\npat: $pat\ndir:$dir\n";
#    opendir DIR, $dir;
#    my @delfiles = grep { $fname ne $_ } grep { /^$pat/ } readdir(DIR);
#    closedir DIR;
#    if(int(@delfiles)){
#        foreach my $f (@delfiles){
#            print "Delete : $dir/$f\n"; 
#        }
#    } 
#
#}


