#!/usr/bin/perl

use strict;
use warnings;

use DB_File;

use lib './lib';

use Packages::Config qw( $TOPDIR $DBDIR );
use Packages::Search qw( :all );
&Packages::Config::init( './' );

my $suite = $ARGV[0] or die "Fatal Error: No suite given";
my $start_time = time;
my $debug = 1;

tie my %packages, 'DB_File', "$DBDIR/packages_small.db",
    O_RDONLY, 0666, $DB_BTREE
    or die "Fatal Error: Couldn't tie DB $DBDIR/packages_small.db: $!\n";

sub get_iso_date {
    my ($age) = @_;

    my ($day, $month, $year) = (gmtime($start_time - ($age*86_400)))[3..5];
    $month++;
    $year += 1900;
    return sprintf( "%04s-%02s-%02s", $year, $month, $day );
}

my $packagesdir = "$TOPDIR/files/packages";
open CHANGES, '>', "$packagesdir/newpkg_info_$suite.new"
    or die "Fatal Error: Couldn't open CHANGES file: $!";
my (%add, %del);
my $lastday;
for (my $age = 7; $age >= 0; $age--) {
    my (%old);
    my $newday = get_iso_date( $age );
    my $oldday = get_iso_date( $age+1 );
    -d "$packagesdir/$oldday" or do {
	warn "Warning: No information available for $oldday\n";
	next unless $lastday;
	$oldday = $lastday;
    };
    -d "$packagesdir/$newday" or do {
	warn "Warning: No information available for $newday\n";
	next;
    };
    $lastday = $newday;
    warn "Process: age=$age oldday=$oldday newday=$newday\n" if $debug;
    open OLD, '<', "$packagesdir/$oldday/package_names_$suite"
	or die "Error: Couldn't open OLD file $packagesdir/$oldday/package_names_$suite: $!\n";
    open NEW, '<', "$packagesdir/$newday/package_names_$suite"
	or die "Error: Couldn't open NEW file $packagesdir/$newday/package_names_$suite: $!\n";
    while (<OLD>) {
	chomp;
	$old{$_} = 1;
    }
    close OLD;
    while (<NEW>) {
	chomp;
	if ($old{$_}) {
	    # we assume here that the input contains no dupes!
	    delete $old{$_};
	} else {
	    if (exists $del{$_}) {
		delete $del{$_};
		warn "Re-Added: $_\n" if $debug;
	    } else {
		$add{$_} = $age;
		warn "Added: $_ (age $age)\n" if $debug;
	    }
	}
    }
    close NEW;
    foreach (keys %old) {
	if (exists $add{$_}) {
	    delete $add{$_};
	    warn "Deleted again: $_\n" if $debug;
	} else {
	    $del{$_} = $age;
	    warn "Deleted: $_ (age $age)\n" if $debug;
	}
    }

}
my %archives = map { $_ => 1 } qw( us security );
foreach (sort (keys %add, keys %del)) {
    my $entry = [];
    my $age = 0;
    if (exists $add{$_}) {
	$entry = read_entry_simple( \%packages, $_, \%archives, $suite);
	die "Fatal Error: Can't find entry for package $_\n"
	    unless @$entry;
	shift @$entry; # remove virtual pkg info
	$age = $add{$_};
    } else {
	$age = $del{$_};
    }
    print CHANGES join(" ", $_, $age, @$entry)."\n";
    print "Wrote entry: ".join(" ", $_, $age, @$entry)."\n";
}
close CHANGES;

rename("$packagesdir/newpkg_info_$suite.new",
       "$packagesdir/newpkg_info_$suite");
