#!/usr/bin/perl

use strict;
use warnings;
use Getopt::Long;
use DistroDBTools;

my %bin_exclude_files = map {$_ => 1} qw!
binary/10-distrodb-old.txt
binary/20-manual-old.txt
binary/40-distrodb-new.txt
binary/40-distrodb.txt
binary/fc-alt-bmap-filesystem.txt
__for_auto_only__
binary/fc-alt-bmap-distrodb-override.txt
!;

my %src_exclude_files = map {$_ => 1} qw!
source/10-distrodb-old.txt
source/20-manual-old.txt
source/40-distrodb-new.txt
source/40-distrodb.txt
__for_auto_only__
source/fc-alt-smap-distrodb-override.txt
!;

my (%dd,%altprovides);

&DistroDBTools::read_map(\%dd, 'binary/10-distrodb-old.txt') if -f 'binary/10-distrodb-old.txt';
&DistroDBTools::read_map(\%dd, 'binary/40-distrodb.txt');
&DistroDBTools::read_distrodb_map(\%altprovides, 'altlinux/sisyphus', 'provides');

&DistroDBTools::extract_by_subroutine('binary',\%bin_exclude_files, 'dd', sub {
    my ($filename, @in)=@_;
    my $distrodb=$dd{$in[0]};
    my $conflict=0;
    if ($distrodb) {
	my $manual=join(' ', sort {$a cmp $b} @in[1 .. $#in]);
	my $autoval=join(' ', sort {$a cmp $b} @$distrodb);
	if ($autoval ne $manual) {
	    #my $prov=$altprovides{$distrodb->[0]};
	    my $prov=$altprovides{$in[1]}->[0];
	    #print "provides for $in[1]: $prov\n";
	    if (@in==2 and @$distrodb==1 and $prov and $prov eq $distrodb->[0]) {
		# not a real conflict; TODO: fix distrodb
	    } else {
		print STDERR "confilct in $filename for $in[0]: manual: $manual distrodb: $autoval\n";
	    }
	    $conflict=1;
	}
    }
    return $distrodb && ! $conflict;
				      });


my (%source_distrodb);
&DistroDBTools::read_map(\%source_distrodb, 'source/10-distrodb-old.txt') if -f 'source/10-distrodb-old.txt';
&DistroDBTools::read_map(\%source_distrodb, 'source/40-distrodb.txt');

&DistroDBTools::extract_by_subroutine('source',\%src_exclude_files, 'dd', sub {
    my ($filename, @in)=@_;
    my $distrodb=$source_distrodb{$in[0]};
    my $conflict=0;
    if ($distrodb) {
	my $manual=join(' ', sort {$a cmp $b} @in[1 .. $#in]);
	my $autoval=join(' ', sort {$a cmp $b} @$distrodb);
	if ($autoval ne $manual) {
	    print STDERR "confilct in $filename for $in[0]: manual: $manual distrodb: $autoval\n";
	    $conflict=1;
	}
    }
    return $distrodb && ! $conflict;
				      });
