use v6.e.PREVIEW;
unit module Render::Series;

use Render::Util;
use Render::Head;
use Render::Post;
use DB::Post;
use DB::Series;

use HTML::Functional;

sub series-date(Series:D $series, $db) is export {
    my $datetime = $series.latest-post: $db;
    if $datetime {
       my $timestamp = sprintf(
           "%s %02d:%02d%s",
           $datetime.yyyy-mm-dd,
           ($datetime.hour % 12) || 12,
           $datetime.minute,
           $datetime.hour < 12 ?? 'am' !! 'pm'
       );

       div :class<series-time>, :title("Latest post made at $timestamp"), [
           icon 'calendar';
           '&nbsp;';
           $datetime.Date.Str
       ]
    } else {
        []
    }
}

sub series-read-time(Series:D $series, $db) is export {
    my @readtimes = $series.post-ids.map(-> $i {$db.posts{$i}.readtimes});
    my ($slow, $average, $fast) = 0, 0, 0;
    for @readtimes -> ($s, $a, $f) {
        $slow += $s;
        $average += $a;
        $fast += $f;
    }
    div :class<series-read-time>, :title<Estimated read time at 140/180/220 WPM>, [
        icon 'timer';
        '&nbsp;';
        mins-to-string $slow;
        '&nbsp;';
        '/';
        '&nbsp;';
        mins-to-string $average;
        '&nbsp;';
        '/';
        '&nbsp;';
        mins-to-string $fast;
    ]
}

sub series-count(Series:D $series, $db) is export {
    my $count = $series.post-ids.elems;
    div :class<series-article-count>, :title("Series has $count articles"), [
        icon 'add-to-queue';
        '&nbsp;';
        do if $count == 1 { "$count article" } else { "$count articles" };
    ]
}

sub series-info(Series:D $series, $db) is export {
    div :class<series-info>, [
        series-date $series, $db;
        series-read-time $series, $db;
        series-count $series, $db;
    ]
}

sub series-header(Series:D $series, $db) is export {
    header :class<series-header>, [
        div :class<series-title>, [
            h1 $series.title;
        ];
        div :class<series-desc>, [
            p $series.desc;
        ];
        series-info $series, $db;
    ]
}

sub series-page(Int:D $series-id, $db) is export {
    my $meta = $db.meta;
    my $series = $db.series{$series-id};
    my $head = generate-head($meta, $series.title, $series.desc);
    my $body =
    body [
        site-header $meta;
        article :class<series>, [
            series-header $series, $db;
            div :class<series-blurbs>,
                $series.post-ids.map(*.&generate-blurb($db));
        ]
    ];

    my $html = html :lang<en>, [
        $head;
        $body
    ];

    show-html $html;
}

sub series-blurb(Int:D $id, Series:D $series, $db) {
    my $link = "/series/$id.html";
    div :class<series-list-blurb>, [
        div :class<series-list-blurb-title>, [
            a :href($link), span [
                h2 $series.title;
            ];
            p $series.desc;
        ];
        series-info $series, $db;
    ]
}

sub series-list-page($db) is export {
   my @series = $db.series.sort(*.value.latest-post: $db);
   my @series-blurbs = ();
   for @series -> $pair {
       my $id = $pair.key;
       my $series = $pair.value;
       @series-blurbs.push:
           series-blurb $id, $series, $db;
   }

   my $head = generate-head($db.meta);
   my $body = body [
       site-header $db.meta;
       div :class<series-list>, [
           h1 "All Series"
       ], @series-blurbs;
   ];

   my $html = html :lang<en>, [
       $head;
       $body;
   ];

   show-html $html;
}