use crate::parser::Body;
use crate::parser::DustTag;
use crate::parser::Template;
use crate::parser::TemplateElement;
use std::collections::HashMap;

struct InlinePartialTreeElement<'a> {
    parent: Option<&'a InlinePartialTreeElement<'a>>,
    blocks: HashMap<&'a str, &'a Option<Body<'a>>>,
}

impl<'a> InlinePartialTreeElement<'a> {
    pub fn new(parent: Option<&'a InlinePartialTreeElement<'a>>) -> InlinePartialTreeElement<'a> {
        InlinePartialTreeElement {
            parent: parent,
            blocks: HashMap::new(),
        }
    }
}

pub fn extract_inline_partials<'a>(
    template: &'a Template<'a>,
) -> HashMap<&'a str, &'a Option<Body<'a>>> {
    let mut blocks: HashMap<&'a str, &'a Option<Body<'a>>> = HashMap::new();

    extract_inline_partials_from_body(&mut blocks, &template.contents);

    blocks
}

fn extract_inline_partials_from_body<'a, 'b>(
    blocks: &'b mut HashMap<&'a str, &'a Option<Body<'a>>>,
    body: &'a Body<'a>,
) {
    for elem in &body.elements {
        match elem {
            TemplateElement::TEIgnoredWhitespace(_) => (),
            TemplateElement::TESpan(span) => (),
            TemplateElement::TETag(dt) => {
                extract_inline_partials_from_tag(blocks, dt);
            }
        }
    }
}

fn extract_inline_partials_from_tag<'a, 'b>(
    blocks: &'b mut HashMap<&'a str, &'a Option<Body<'a>>>,
    tag: &'a DustTag,
) {
    match tag {
        DustTag::DTComment(..) => (),
        _ => (), // TODO: Implement the rest
    }
}