use sable_core::config::PageConfig;
use tera::Context;

use crate::{IntoDiagnostic as _, Renderer, RendererError};

impl Renderer {
    /// Render all custom pages using [`tera`] and write then to the destination folder.
    pub fn render_pages(&self) {
        for page in &self.config.pages {
            if let Err(err) = self.render_page(page).into_diagnostic() {
                tracing::error!(path=%page.path, "failed to render custom page");
                eprintln!("{err:?}");
            }
        }
    }

    fn render_page(&self, page: &PageConfig) -> Result<(), RendererError> {
        let dest_path = self.config.build.join(&page.path);

        if let Some(dir) = dest_path.parent() {
            std::fs::create_dir_all(dir).map_err(RendererError::CreateDir)?;
        }

        let mut ctx = Context::new();

        ctx.insert("meta", &self.meta_info);
        if let Some(data) = self.config.data.as_ref() {
            ctx.insert("data", data);
        }

        let rendered = self
            .templates
            .render(&page.template, &ctx)
            .map_err(RendererError::RenderTemplate)?;

        std::fs::write(dest_path, rendered).map_err(RendererError::WriteTemplate)?;

        Ok(())
    }
}
