#!/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";
}
