#!/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:
		site-generator index about

		Generate the whole site:
		site-generator ALL

=head1 DESCRIPTION

This is a site generator for the Hacker Public Radio website based upon the Perl Templates Toolkit.

=head1 INSTALLATION

	* Create the sqlite3 database from the files in the _sql directory. The default name for the 
	  database file is "hpr.db" and should be located in the root of the project directory. The 
	  name and location can be set in the site.cfg file.
	* Install the needed Perl modules using preferred method (distribution packages, CPAN, etc.)
		* GetOpt
		* Pod::Usage
		* Config::Std
		* Template
		* DBI

=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 ".";
	};
}