use super::{
    pagination::{PaginatableTemplate, PaginationInfo},
    posts::{parse::Tag, HtmlContent, Post},
    util::templates::filters,
    util::templates::TemplateCommon,
};
use crate::generator::pagination::render_paginated;
use askama::Template;
use std::collections::HashMap;

pub fn generate(posts: &[Post<HtmlContent>]) -> HashMap<&Tag, Vec<&Post<HtmlContent>>> {
    let mut tags: HashMap<&Tag, Vec<&Post<HtmlContent>>> = HashMap::new();
    for p in posts.iter() {
        if let Some(ref ts) = p.metadata.tags {
            for t in ts.iter() {
                if tags.contains_key(t) {
                    let res = tags.get_mut(t).unwrap();
                    res.push(&p);
                } else {
                    tags.insert(t, vec![&p]);
                }
            }
        }
    }
    // for (k, v) in tags.iter() {
    //     print!("{}: [", k.slug);
    //     let mut first = true;
    //     for p in v.iter() {
    //         if !first {
    //             print!(", ");
    //         } else {
    //             first = false;
    //         }
    //         print!("'{}'", p.metadata.title);
    //     }
    //     println!("]");
    // }

    for (&tag, posts) in &tags {
        render_paginated(
            &TagTemplate {
                tag,
                posts: &[],
                pagination_info: Default::default(),
            },
            posts,
            &tag.slug,
        )
        .unwrap();
    }

    return tags;
}

#[derive(Template)]
#[template(path = "tag.html")]
struct TagTemplate<'a> {
    tag: &'a Tag,
    posts: &'a [&'a Post<HtmlContent>],
    pagination_info: PaginationInfo,
}

impl<'a> TemplateCommon for TagTemplate<'a> {}

impl<'a> TagTemplate<'a> {
    fn permalink(&self) -> String {
        format!("/{}/", self.tag.slug)
    }
}

impl<'a> PaginatableTemplate<'a> for TagTemplate<'a> {
    fn with_posts(
        &'a self,
        posts: &'a [&'a Post<HtmlContent>],
        pagination_info: PaginationInfo,
    ) -> Self {
        Self {
            posts,
            pagination_info,
            ..*self
        }
    }
}
