#!/usr/bin/perl

use strict;
use warnings;

my $VERSION = '0.6';

use locale;
use POSIX qw (locale_h);
setlocale(LC_ALL, 'es_ES.UTF-8');

use Digest::MD5;
use Encode qw(encode_utf8);

use Gruta;

use Gruta::CGI;
use Gruta::Source::FS;
use Gruta::Renderer::Grutatxt;
use Gruta::Renderer::HTML;
use Gruta::Renderer::Text;
use Gruta::Template::Art5;

sub usage() {
    print "Usage: $0 {src} {destination folder} {base url}\n";
    exit 1;
}

sub out {
    my $g           = shift;
    my $template    = shift;
    my $file        = shift;
    my $args        = shift || {};

    $args->{t} = $template;
    $g->template->_art5->{xh} = $args;

    $g->template->_art5->{abort} = 0;
    $g->template->{search_count} = 0;

    my $o = $g->template->process($template);

    if ($g->template->_art5->{abort}) {
        print ("NOT Creating $file\n");
    }
    else {
        my $ow = 1;
        my $of = $g->{_folder} . '/' . $file;

        if (open F, $of) {
            my $md5_o = Digest::MD5->new();
            my $md5_p = Digest::MD5->new();

            my $p = join('', <F>);
            close F;

            $md5_o->add(encode_utf8($o));
            $md5_p->add(encode_utf8($p));

            if ($md5_o->hexdigest() eq $md5_p->hexdigest()) {
                $ow = 0;
            }
        }

        if ($ow) {
            print("Creating $file\n");
            open F, '>' . $of or die;
            print F $o;
            close F;
        }
        else {
            print("Skipping $file (same content)\n");
        }
    }
}

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

my $index_num   = 20;
my $topic_num   = 20;

my $base    = shift(@ARGV) or usage();
my $folder  = shift(@ARGV) or usage();
my $url     = shift(@ARGV) or usage();

$Gruta::VERSION_CODENAME .= " (+ gruta-snapshot $VERSION)";

my $lang;
if ($ENV{LANG}) {
    ($lang) = ($ENV{LANG} =~ /^(..)/);
}
else {
    $lang = 'en';
}

my $g = Gruta->new(
    id          => '',
    source      => Gruta::Source::FS->new( path => "${base}/"),
    renderers   => [
        Gruta::Renderer::Grutatxt->new(),
        Gruta::Renderer::HTML->new(),
        Gruta::Renderer::HTML->new( valid_tags => undef ),
        Gruta::Renderer::Text->new(),
    ],
    template    => Gruta::Template::Art5->new(lang => $lang),
    cgi         => Gruta::CGI->new(
            upload_dirs	=> [
                "${base}/img",
                "${base}/download"
            ],
    ),
    args        => {
            base_url    => $url,
            static_urls => 2,
            dummy_touch => 1
    },
    _folder     => $folder
);

$index_num = $g->template->process('cfg_index_num');
$topic_num = $g->template->process('cfg_topic_num');

mkdir $folder, 0755;
mkdir $folder . '/top/', 0755;

out($g, 'INDEX',    'index.html', { num => $index_num } );

my @topics = split(/:/, ($g->template->process('cfg_index_topics')));

my @all = $g->source->stories_by_date(\@topics);

my $max = scalar(@all) - $index_num;
my $offset = $index_num;

# if @all is empty, it can be because 'cfg_index_topics' contain
# numbers and uses 'grouped_index', so this may not be an error
if (scalar(@all)) {
    print "$max stories\n";

    while ($max > 0) {
        out($g, 'INDEX', "${offset}.html", { num => $index_num, offset => $offset });
        $offset += $index_num;
        $max    -= $index_num;
    }
}

out($g, 'CSS',          'style.css');
out($g, 'RSS',          'rss.xml');
out($g, 'RSS_COMMENTS', 'rss-comments.xml');
out($g, 'SITEMAP',      'sitemap.xml');

my %DATES = ();

foreach my $t (sort $g->source->topics()) {
    mkdir $folder . '/' . $t, 0755;

    my @stories = $g->source->stories($t);

    my $today = Gruta::Data::today('%y%m%d');

    foreach my $s (sort @stories) {
        if ($s eq 'index') {
            next;
        }

        out($g, 'STORY', "$t/$s.html", {
            topic   => $t,
            id      => $s
            }
        );    

        my $story = $g->source->story($t, $s);

        my $d = $story->date('%y%m%d');

        if ($d && $d <= $today) {
            $DATES{$d}++;
        }
    }

    out($g, 'TOPIC',    "$t/index.html", { 'topic' => $t, 'num' => $topic_num });

    my $max = scalar(@stories) - $topic_num;
    my $offset = $topic_num;

    while ($max > 0) {
        out($g, 'TOPIC', "$t/~${offset}.html", {
            topic   => $t,
            num     => $topic_num,
            offset  => $offset
            }
        );
        $max -= $topic_num;
        $offset += $topic_num;
    }
}

foreach my $d (sort(keys(%DATES))) {
    mkdir $folder . '/' . $d;

    my $f = $folder . '/' . $d . '/index.html';

    out($g, 'SEARCH_BY_DATE', "${d}/index.html", {
        from    => "${d}000000",
        to      => "${d}235959"
        }
    );
}


mkdir $folder . '/tag/', 0755;

out($g, 'TAGS', 'tag/index.html');

foreach my $t ($g->source->tags()) {
    out($g, 'SEARCH_BY_TAG', "tag/$t->[0].html", { tag => $t->[0] });
}

out($g, 'TOP_TEN',  'top/index.html');

open F, '>' . $g->{_folder} . '/.timestamp';
close F;
