#!/usr/bin/perl -w
#
# Copyright (C) 2008 Michael Brown <mbrown@fensystems.co.uk>.
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License as
# published by the Free Software Foundation; either version 2 of the
# License, or any later version.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.

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

# List of licences we can handle
my $known_licences = {
  gpl_any => {
    desc => "GPL (any version)",
    can_subsume => {
      public_domain => 1,
      bsd3 => 1,
      bsd2 => 1,
      mit  => 1,
      isc  => 1,
    },
  },
  gpl2_or_later => {
    desc => "GPL version 2 (or, at your option, any later version)",
    can_subsume => {
      gpl_any => 1,
      public_domain => 1,
      bsd3 => 1,
      bsd2 => 1,
      mit  => 1,
      isc  => 1,
    },
  },
  gpl2_only => {
    desc => "GPL version 2 only",
    can_subsume => {
      gpl_any => 1,
      gpl2_or_later => 1,
      public_domain => 1,
      bsd3 => 1,
      bsd2 => 1,
      mit  => 1,
      isc  => 1,
    },
  },
  public_domain => {
    desc => "Public Domain",
    can_subsume => {},
  },
  bsd4 => {
    desc => "BSD Licence (with advertising clause)",
    can_subsume => {
      public_domain => 1,
      bsd3 => 1,
      bsd2 => 1,
      mit  => 1,
      isc  => 1,
    },
  },
  bsd3 => {
    desc => "BSD Licence (without advertising clause)",
    can_subsume => {
      public_domain => 1,
      bsd2 => 1,
      mit  => 1,
      isc  => 1,
    },
  },
  bsd2 => {
    desc => "BSD Licence (without advertising or endorsement clauses)",
    can_subsume => {
      public_domain => 1,
      mit  => 1,
      isc  => 1,
    },
  },
  mit => {
    desc => "MIT/X11/Xorg Licence",
    can_subsume => {
      public_domain => 1,
      isc => 1,
    },
  },
  isc => {
    desc => "ISC Licence",
    can_subsume => {
      public_domain => 1,
    },
  },
};

# Parse command-line options
my $verbosity = 1;
Getopt::Long::Configure ( 'bundling', 'auto_abbrev' );
GetOptions (
  'verbose|v+' => sub { $verbosity++; },
  'quiet|q+' => sub { $verbosity--; },
) or die "Could not parse command-line options\n";

# Parse licence list from command line
my $licences = {};
foreach my $licence ( @ARGV ) {
  die "Unknown licence \"$licence\"\n"
      unless exists $known_licences->{$licence};
  $licences->{$licence} = $known_licences->{$licence};
}
die "No licences specified\n" unless %$licences;

# Dump licence list
if ( $verbosity >= 1 ) {
  print "The following licences appear within this file:\n";
  foreach my $licence ( keys %$licences ) {
    print "  ".$licences->{$licence}->{desc}."\n"
  }
}

# Apply licence compatibilities to reduce to a single resulting licence
foreach my $licence ( keys %$licences ) {
  # Skip already-deleted licences
  next unless exists $licences->{$licence};
  # Subsume any subsumable licences
  foreach my $can_subsume ( keys %{$licences->{$licence}->{can_subsume}} ) {
    if ( exists $licences->{$can_subsume} ) {
      print $licences->{$licence}->{desc}." subsumes ".
	  $licences->{$can_subsume}->{desc}."\n"
	  if $verbosity >= 1;
      delete $licences->{$can_subsume};
    }
  }
}

# Print resulting licence
die "Cannot reduce to a single resulting licence!\n"
    if ( keys %$licences ) != 1;
( my $licence ) = keys %$licences;
print "The overall licence for this file is:\n  " if $verbosity >= 1;
print $licences->{$licence}->{desc}."\n";
