#!/usr/bin/perl

use XML::XPath;
use XML::XPath::XMLParser;


my %distmap = (
  "sleshammer.SLE_11_SP3.config.xml" => "%if 0%{?suse_version} == 1110",
  "sleshammer.SLE_12.config.xml" => "%if 0%{?suse_version} == 1315",
  "sleshammer.openSUSE_13.1.config.xml" => "%if 0%{?suse_version} == 1310",
  "sleshammer.openSUSE_13.2.config.xml" => "%if 0%{?suse_version} == 1320"
);

sub map_kiwiname_to_suseversion($){
  my $kiwi = shift;
  my $ret = "ERROR: please add $kiwi to $0";

  $ret = "$distmap{$kiwi}" if (exists $distmap{$kiwi});

  return $ret;
}

my $xp = XML::XPath->new();
my $skip=0;

open FH, '<', 'sleshammer.spec' or die "Error: could not open sleshammer.spec: ".$?;
my @kiwiconfigs = glob("*.config.xml");

while (<FH>) {
  if ($_ =~ /^# END: generated BuildRequires/) {
    $skip = 0;

    foreach my $kiwi (@kiwiconfigs) {
      print map_kiwiname_to_suseversion($kiwi)."\n";
      print "# START: packages for $kiwi\n";

      my $xp = XML::XPath->new( filename => $kiwi, parser => $xp->get_parser );
      my $nodeset = $xp->find('/image/packages/package[@name]');

      # we'll create a hash that list packages for each architecture
      my %packages;

      foreach my $pkg ($nodeset->get_nodelist) {
        my $arch = $pkg->getAttribute('arch') || 'common';
        @packages{$arch} = [] unless length(@packages{$arch});
        push(@{$packages{$arch}}, $pkg->getAttribute('name') || "brokenXML");
      }

      # first list BuildRequires common to all architectures, and then specific
      # to each architecture
      foreach my $name (sort(@{$packages{'common'}})) {
        print "BuildRequires:  ".($name)."\n";
      }

      foreach my $arch (sort(keys(%packages))) {
          next if $arch eq 'common';
          print "%ifarch ".($arch)."\n";
          foreach my $name (sort(@{$packages{$arch}})) {
            print "BuildRequires:  ".($name)."\n";
          }
        print "%endif\n";
      }

      print "# END: packages for $kiwi\n";
      print "%endif\n";
    }
  }

  print $_ unless $skip;
  $skip = 1 if $_ =~ /^# START: generated BuildRequires/;
}

close FH;
