package GOB::Template;
use strict;
use FileHandle;
use Text::ScriptTemplate;

=head1 Bee Templates
 The perl-based templating system for use in Bee apps.

 This is mostly a pass-through to Text::Template::Simple

 The intent is to make our perl templates as similar to PHP as possible
 * Delimiters: [* *code* *]
 * Extend PHP: [*= $variable *]
 * PHP echo:
	<li class="nav_[* if ($page == "index.php") echo 'active'; else echo 'button' *]"><a href="/">Home</a></li>
 * PHP include (TODO: How doe
	<?pl include("inc_header.plt", $data); *]	
 

 No more Embperl, too many compilation issues and odd behaviors.

	$ENV{EMBPERL_OPTIONS} = 16384;
	$ENV{EMBPERL_SYNTAX} = "EmbperlBlocks";
	$dfile = $ENV{GOB_PROJECT_ROOT}."/output/reports/PDoc_${dfile}.html";
	Embperl::Execute ({ 
		inputfile  => $ENV{GOB_ROOT}.'/lib/reporting_templates/pipeline_documentation.htt',
		param => [$ph, $pfile],
		outputfile => $dfile,
		escmode => 0,

	});

 becomes roughly:
 # Bee Template Engine
	GOB::Template::exec(
		$ENV{GOB_ROOT}.'/lib/reporting_templates/pipeline_documentation.htt',
       [$ph, $pfile], # could be {ph => $ph, pfile => $pfile},
       {
       	   OUT_FILE_NAME => $dfile
       });

=cut

sub exec{
	my ($tfile, $tdata, $opts) = @_;

	my $OUTFH  = undef;
	if($OUTFH = $opts->{OUT_FILE_HANDLE}){
	}elsif($opts->{OUT_FILE_NAME}){
	    $OUTFH = FileHandle->new('> '.$opts->{OUT_FILE_NAME});
	    if(!$OUTFH){
	    	die "Couldn't open output file: [".$opts->{OUT_FILE_NAME}."]";
	    }
	}

	#$Text::ScriptTemplate::DEBUG = 1; #$opts->{DEBUG};

	my $tst = Text::ScriptTemplate->new();
	$tst->load(
		$tfile,
		DELIM => [qw([* *])]
		);

	$tst->setq(
		tdata => $tdata
		);

	# get our Expanded Template STRing
	my $et_str = $tst->fill(
		PACKAGE => new GOB::_TSpace(),
		OHANDLE => $OUTFH,
		);

	# The `eval` used in the templating system doesn't pass along errors
	if($@){
		my $raw_code = $tst->{buff};
		my $numberred_code = '';
		my $lno = 0; # Line NOmber
		foreach my $line (split(/\n/, $raw_code)){
			$numberred_code .= $lno++ .$line."\n";
		}
		die "Template error: [$@] in [$tfile], code: [$numberred_code]";
	}
	return $et_str;
}

1;

#############################################################################
# This seems to be necessary-ish for Text::ScriptTemplate
##############################################################################
package GOB::_TSpace;
use Data::Dumper;
use warnings;
use strict;
use vars qw($tdata @tdata %tdata $_handle $_OBUFFER $_OHANDLE);

sub new { bless {}, shift }
	