use nom::{
    IResult, Parser,
    character::complete::char,
    multi::{many_m_n, many1},
    sequence::preceded,
};

use crate::{
    ast::Block,
    parser::util::{line_terminated, not_eof_or_eol0},
};

pub(super) fn blockquote<'a>() -> impl FnMut(&'a str) -> IResult<&'a str, Vec<Block>> {
    move |input: &'a str| {
        let prefix = preceded(many_m_n(0, 3, char(' ')), char('>'));

        let (input, lines) =
            many1(preceded(prefix, line_terminated(not_eof_or_eol0))).parse(input)?;
        let inner = lines.join("\n");

        let (_, inner) = many1(crate::parser::blocks::block())
            .parse(&inner)
            .map_err(|err| err.map_input(|_| input))?;

        let inner = inner.into_iter().flatten().collect();

        Ok((input, inner))
    }
}
