package Gruntmaster::Page::Base;

use 5.014000;
use strict;
use warnings;

use Encode qw/encode/;
use File::Slurp qw/read_file/;
use HTML::Template::Compiled;

##################################################

use POSIX ();
use Gruntmaster::Data ();
use List::Util ();

sub import {
	my $caller = caller;
	my ($self, $name, $title) = @_;

	Gruntmaster::Data->export_to_level(1, $caller);
	List::Util->export_to_level(1, $caller, qw/sum/);

	no strict 'refs';
	*{"${caller}::strftime"} = \&POSIX::strftime;
	*{"${caller}::NAME"} = sub () { $name };
	*{"${caller}::TITLE"} = sub () { $title };
	*{"${caller}::debug"} = sub {
		local $Log::Log4perl::caller_depth = $Log::Log4perl::caller_depth + 1;
		$_[0]->({qw/level debug message/ => $_[1]})
	};
}

##################################################

my %orig_header_templates = (
  en => <<'HTML',
<!DOCTYPE html>
<title>TITLE_GOES_HERE</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">

<link rel="stylesheet" href="/css/cyborg" id="stylesheet">
<script src="/js" type="text/javascript"></script>

<nav class="navbar navbar-default navbar-static-top" role="navigation">
<div class="container-fluid">
<div class="navbar-header">
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1"> <span class="sr-only">Toggle navigation</span><span class="icon-bar"></span><span class="icon-bar"></span><span class="icon-bar"></span></button>
<a class="navbar-brand" href="/">Gruntmaster 6000</a>
</div>

<div class="collapse navbar-collapse">
<ul class="nav navbar-nav">
<li><a href="/pb/">Problems</a>
<li><a href="/ct/">Contests</a>
<li><a href="/account">Account</a>
</ul>

<ul class="nav navbar-nav navbar-right">
<li><a class="dropdown-toggle" data-toggle="dropdown"> Theme <span class="caret"></span></a>

<ul class="dropdown-menu" role="menu">
<li><a href="#" id="theme_slate">Gunmetal gray</a>
<li><a href="#" id="theme_cyborg">Black</a>
<li><a href="#" id="theme_cerulean">White</a>
<li><a href="#" id="theme_cosmo">Metro</a>
</ul>

<li><a href="/log/">Job log</a>
</ul>
</div>
</div>
</nav>

<div class="container-fluid">

<div id="subtitle">TITLE_GOES_HERE</div>

HTML
);

my %orig_footer_templates = (
  en => <<'HTML',

<footer>
Dilmom: Why don't you call your product the Gruntmaster 6000?
Dilbert: What kind of product do you see when you imagine a Gruntmaster 6000?
Dilmom: Well, it's a stripped-down version of the Gruntmaster 9000, of course. But it's software-upgradeable.
</footer>
HTML
);

sub patch_templates {
	my $root = 'tmpl';
	return %{$_[0]} unless -d $root;
	my ($templates, $name) = @_;
	my %out = %$templates;
	for (<$root/$name.*>) {
		m/\.(.+)$/;
		$out{$1} = read_file $_
	}

	%out
}

my %header_templates = patch_templates \%orig_header_templates, 'header';
my %footer_templates = patch_templates \%orig_footer_templates, 'footer';

sub header{
  my ($language, $title) = @_;
  $header_templates{$language} =~ s/TITLE_GOES_HERE/$title/ger;
}

sub footer{
  $footer_templates{$_[0]};
}

sub cook_templates {
	my ($templates, $name, $title) = @_;

	my %out = patch_templates $templates, $name;
	$out{$_}  = header ($_, $title) . $out{$_} for keys %out;
	$out{$_} .= footer  $_  for keys %out;

	%out
}

##################################################

my %templates;

sub generate{
	my ($self, $lang, @args) = @_;

	$templates{$self} = { cook_templates $self->TEMPLATES, $self->NAME => $self->TITLE } unless exists $templates{$self};

	my $htc = HTML::Template::Compiled->new(scalarref => \$templates{$self}{$lang}, default_escape => 'HTML',);
	$self->_generate($htc, $lang, @args);
	[200, ['Content-Type' => 'text/html', 'Content-Language' => $_[1], 'Vary' => 'Accept-Language'], [ encode 'UTF-8' => $htc->output ] ]
}

sub _generate {}

sub variants {
	[ map { [ $_, 1, 'text/html', undef, undef, $_, undef ]} keys $_[0]->TEMPLATES ]
}

1
