#!/usr/bin/perl

=head1 NAME

siteGenerator - HPR Site Generator

=head1 SYNOPSIS

	siteGenerator [OPTION]... PAGE...

	-v, --verbose  use verbose mode
	--help         print this help message

	Where I<PAGE> is a file name of a web page 
	or the special ALL (to generate all pages).

	Examples:

		Generate two specific pages:
		siteGenerator index about

		Generate the whole site:
		siteGenerator ALL

=head1 DESCRIPTION

This is a site generator based upon the Perl Templates Toolkit.

=head1 AUTHOR

Roan Horning <roan.horning@no-spam.gmail.com>

=cut

use strict;
use warnings;

use Getopt::Long qw(:config auto_help);
use Pod::Usage;
use Config::Std;
use Template;

exit main();

sub main {

    # Argument parsing
    my $verbose;
    GetOptions(
        'verbose'  => \$verbose,
    ) or pod2usage(1);
    pod2usage(1) unless @ARGV;
    my (@pages) = @ARGV;

	# Set flag indicating whether or not to generate all pages.
	# The flag is set to true if the special argument ALL is 
	# passed into the generator
	my $ALL = grep { $_ eq 'ALL' } @pages;

	# Load config file
	read_config "site.cfg" => my %config;

	my $tt = get_template_html($config{DBI});

	if ($ALL) {
		@pages = keys %config;

		# Remove non page sections of the configuration file
		# from the generated list of pages.
		@pages= grep { $_ ne 'DBI' } @pages;
		@pages= grep { $_ ne 'root_template' } @pages;
	};
	foreach my $page (@pages) {

		if (exists($config{$page})) {
			verbose ($verbose, "Generating page: $page");
			generate_page($tt, $config{root_template}{content}, $config{$page}{navigation}, $config{$page}{content});

		}
		else {
			verbose (1, "\nWarning: Page $page is not defined in the configuration file.");
		}
	}
    verbose (1, "\nFinished processing the files.");
	return 0;
}

sub get_template_html (\%@)  {
	# For an HTML based Template file, define the 
	# template start and end tags to also function as 
	# HTML comments to make the template file valid HTML.
	#
	return Template->new({
		INCLUDE_PATH => './templates',
		EVAL_PERL    => 1,
		START_TAG	 => '<!--%',
		END_TAG		 => '%-->',
		CONSTANTS    => {
			driver   => $_[0]{driver},
			user     => $_[0]{user},
			password => $_[0]{password},
		}
	}) || die $Template::ERROR, "\n";

}

sub generate_page  {
	my ($tt, $page, $navigation, $content) = @_;
	my $tt_vars = {
		navigation => $navigation, 
		content => $content 
	};

	$tt->process($page, $tt_vars)
		|| die $tt->error(), "\n";

}

sub verbose {
	my ($verbose, $message) = @_;
	if ($verbose) {
		print "$message\n";
	}
	else {
		print ".";
	};
}