#!/usr/bin/perl
#
# sbuild: build packages, obeying source dependencies
# Copyright © 1998-2000 Roman Hodek <Roman.Hodek@informatik.uni-erlangen.de>
# Copyright © 2005      Ryan Murray <rmurray@debian.org>
# Copyright © 2005-2009 Roger Leigh <rleigh@debian.org
# Copyright © 2008      Timothy G Abbott <tabbott@mit.edu>
# Copyright © 2008      Simon McVittie <smcv@debian.org>
#
# 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
# (at your option) 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, see
# <http://www.gnu.org/licenses/>.
#
#######################################################################

use strict;
use warnings;

use Sbuild::Conf qw();
use Buildd::Conf qw();
use Sbuild::Sysconfig;
use Text::Wrap;
use Data::Dumper;

die "Usage: $0 sbuild|buildd config|man" if @ARGV != 2;

my $program = $ARGV[0];
my $output = $ARGV[1];

$Sbuild::Sysconfig::paths{'SBUILD_CONF'} = '/invalid';
$Sbuild::Sysconfig::paths{'BUILDD_CONF'} = '/invalid';

$Data::Dumper::Sortkeys = 1;

my $conf;
if ($program eq "sbuild") {
    $conf = Sbuild::Conf::new(CHECK=>0);
} elsif ($program eq "buildd") {
    $conf = Buildd::Conf::new(CHECK=>0);
} else {
    die "Unsupported configuration type $program";
}
exit 1 if !defined($conf);


die "Unsupported output type $output"
    if ($output ne "config" && $output ne "man");



my @keys = $conf->get_keys();

# print "KEYS: " . join(", ", @keys) . "\n";

my %tmpgroups;

foreach my $key (@keys) {
#    print "KEY: $key, GROUP: " . $conf->_get_group($key) . "\n";
    $tmpgroups{$conf->_get_group($key)} = 1;
}

my @groups = sort keys %tmpgroups;

# print "GROUPS: " . join(",\n", @groups) . "\n";


my $header = "# ${program}.conf: ${program} settings.                                    -*- Perl -*-\n";

$header .= <<END;
# Default settings are commented out.
# Note that all possible settings are listed here.  Many may be set on
# the command-line, and do not normally need setting here,
# e.g. \$verbose.  Others need setting by each individual user in their
# ~/.${program}rc, but are listed here for completeness.
END

if ($output eq "config") {
    print "$header";
}
foreach my $group (@groups) {
    # Don't print internal keys
    next if $group =~ m/^__/;

    if ($output eq "config") {
	print "\n\n##\n## $group\n##\n\n";
    } elsif ($output eq "man") {
	print ".SS $group\n";
    }

    foreach my $key (@keys) {
	if ($conf->_get_group($key) eq $group) {
	    my $type = $conf->_get_type($key);
	    my $varname = $conf->_get_varname($key);
	    my $help = $conf->_get_help($key);
	    my $default = $conf->_get_default($key);
	    my $ignore_default = $conf->_get_ignore_default($key);
	    my $cli_options = $conf->_get_cli_options($key);
	    my $example = $conf->_get_example($key);
	    if ($output eq "config") {
		print "# $key\n";
		print "# Type: $type\n";
		if ($help) {
		    print wrap("# ", "# ", "$help\n");
		}
		if ($cli_options) {
		    print "# See also related command line options in sbuild(1):\n";
		    foreach my $opt (@{$cli_options}) {
			print "#   $opt\n";
		    }
		}
		if ($example) {
		    foreach my $line (split("\n", $example)) {
			print "#    $line\n";
		    }
		}
		if ($ignore_default) {
			print wrap("#", "#", "$varname = ...;");
			print("\n");
		} else {
			print wrap("#", "#", Data::Dumper->Dump([$default],
							["$varname"]));
		}
		print("\n");
	    } elsif ($output eq "man") {
		print ".TP\n";
		print ".BR $key\n";
		print "$type type.\n";
		if ($help) {
		    print "$help\n";
#		    print wrap("", "", "$help\n");
		}
		if ($cli_options) {
		    print ".IP\n";
		    print "Related\n";
		    print ".BR sbuild (1)\n";
		    print "command line options:\n";
		    print ".PP\n";
		    print ".RS\n";
		    foreach my $opt (@{$cli_options}) {
			print "\\f[CR]$opt\\fP\n";
			print ".br\n";
		    }
		    print ".RE\n";
		}
		if ($example) {
		    print ".IP\n";
		    print "Example:\n";
		    print ".PP\n";
		    print ".RS\n";
		    foreach my $line (split("\n", $example)) {
			print "\\f[CR]$line\\fP\n";
			print ".br\n"
		    }
		    print ".RE\n";
		}
		if ($ignore_default) {
		    print ".PP\n";
		    print ".RS\n";
			print "\\f[CR]$varname = ...;\\fP\n";
			print ".br\n";
		    print ".RE\n";
		} else {
		    print ".IP\n";
		    print "Default:\n";
		    print ".PP\n";
		    print ".RS\n";
		    foreach my $line (split("\n",
					    Data::Dumper->Dump([$default],
							       ["$varname"]))) {
			print "\\f[CR]$line\\fP\n";
			print ".br\n"
		    }
		    print ".RE\n";
		}
	    }
	}
    }
}
if ($output eq "config") {
    print "1;\n";
}
