use super::*;
use crate::style::Style;
use ascii_canvas::AsciiView;
use std::fmt::{Debug, Error, Formatter};

pub struct Styled {
    style: Style,
    content: Box<dyn Content>,
}

impl Styled {
    pub fn new(style: Style, content: Box<dyn Content>) -> Self {
        Styled { style, content }
    }
}

impl Content for Styled {
    fn min_width(&self) -> usize {
        self.content.min_width()
    }

    fn emit(&self, view: &mut dyn AsciiView) {
        self.content.emit(&mut view.styled(self.style))
    }

    fn into_wrap_items(self: Box<Self>, wrap_items: &mut Vec<Box<dyn Content>>) {
        let style = self.style;
        super::into_wrap_items_map(self.content, wrap_items, |item| Styled::new(style, item))
    }
}

impl Debug for Styled {
    fn fmt(&self, fmt: &mut Formatter<'_>) -> Result<(), Error> {
        fmt.debug_struct("Styled")
            .field("content", &self.content)
            .finish()
    }
}
