use crate::error::{ApiForgeError, Result};
use std::collections::HashMap;
use tera::{Context, Tera};

pub struct TemplateEngine {
    tera: Tera,
}

impl TemplateEngine {
    pub fn new() -> Self {
        Self {
            tera: Tera::default(),
        }
    }

    pub fn render(&mut self, template: &str, context: &HashMap<String, String>) -> Result<String> {
        let mut tera_context = Context::new();
        for (key, value) in context {
            tera_context.insert(key, value);
        }

        self.tera
            .render_str(template, &tera_context)
            .map_err(|e| ApiForgeError::Config(format!("Template rendering failed: {}", e)))
    }

    pub fn render_simple(&mut self, template: &str, key: &str, value: &str) -> Result<String> {
        let mut context = HashMap::new();
        context.insert(key.to_string(), value.to_string());
        self.render(template, &context)
    }
}

impl Default for TemplateEngine {
    fn default() -> Self {
        Self::new()
    }
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn test_render_simple() {
        let mut engine = TemplateEngine::new();
        let result = engine
            .render_simple("Hello {{ version }}!", "version", "1.2.3")
            .unwrap();
        assert_eq!(result, "Hello 1.2.3!");
    }

    #[test]
    fn test_render_multiple() {
        let mut engine = TemplateEngine::new();
        let mut context = HashMap::new();
        context.insert("project".to_string(), "myapp".to_string());
        context.insert("version".to_string(), "1.0.0".to_string());

        let result = engine
            .render("Deploying {{ project }} v{{ version }}", &context)
            .unwrap();
        assert_eq!(result, "Deploying myapp v1.0.0");
    }
}
