from jinja2 import Environment, Template
from jinja2.meta import find_undeclared_variables
from typing import List, Any

def render_jinja_template(template: str, **kwargs: Any) -> str:
    """
    Render a Jinja2 template using the provided variables.

    Args:
        template (str): The Jinja2 template string.
        **kwargs: Variables to be used in rendering the template.

    Returns:
        str: The rendered template string.
    """
    return Template(template).render(**kwargs)

def extract_jinja_variables(template: str) -> List[str]:
    """
    Extract undeclared variables from a Jinja2 template. These variables represent placeholders 
    that need to be filled in during rendering.

    Args:
        template (str): The Jinja2 template string.

    Returns:
        List[str]: A list of undeclared variable names in the template.
    """
    environment = Environment()
    parsed_content = environment.parse(template)
    
    # Extract all undeclared variables (placeholders)
    undeclared_variables = find_undeclared_variables(parsed_content)
    
    return list(undeclared_variables)