"""
Module for checking jinja maps and verifying the result of loading JSON/YAML
files

.. versionadded:: 3000
"""

import functools
import logging
import textwrap

import salt.loader
import salt.template
import salt.utils.json

log = logging.getLogger(__name__)


def _strip_odict(wrapped):
    """
    dump to json and load it again, replaces OrderedDicts with regular ones
    """

    @functools.wraps(wrapped)
    def strip(*args):
        return salt.utils.json.loads(salt.utils.json.dumps(wrapped(*args)))

    return strip


@_strip_odict
def load_map(path, value):
    """
    Loads the map at the specified path, and returns the specified value from
    that map.

    CLI Example:

    .. code-block:: bash

        # Assuming the map is loaded in your formula SLS as follows:
        #
        # {% from "myformula/map.jinja" import myformula with context %}
        #
        # the following syntax can be used to load the map and check the
        # results:
        salt myminion jinja.load_map myformula/map.jinja myformula
    """
    tmplstr = textwrap.dedent(
        """\
        {{% from "{path}" import {value} with context %}}
        {{{{ {value} | tojson }}}}
        """.format(
            path=path, value=value
        )
    )
    return salt.template.compile_template_str(
        tmplstr,
        salt.loader.render(__opts__, __salt__),
        __opts__["renderer"],
        __opts__["renderer_blacklist"],
        __opts__["renderer_whitelist"],
    )


@_strip_odict
def import_yaml(path):
    """
    Loads YAML data from the specified path

    CLI Example:

    .. code-block:: bash

        salt myminion jinja.import_yaml myformula/foo.yaml
    """
    tmplstr = textwrap.dedent(
        """\
        {{% import_yaml "{path}" as imported %}}
        {{{{ imported | tojson }}}}
        """.format(
            path=path
        )
    )
    return salt.template.compile_template_str(
        tmplstr,
        salt.loader.render(__opts__, __salt__),
        __opts__["renderer"],
        __opts__["renderer_blacklist"],
        __opts__["renderer_whitelist"],
    )


@_strip_odict
def import_json(path):
    """
    Loads JSON data from the specified path

    CLI Example:

    .. code-block:: bash

        salt myminion jinja.import_JSON myformula/foo.json
    """
    tmplstr = textwrap.dedent(
        """\
        {{% import_json "{path}" as imported %}}
        {{{{ imported | tojson }}}}
        """.format(
            path=path
        )
    )
    return salt.template.compile_template_str(
        tmplstr,
        salt.loader.render(__opts__, __salt__),
        __opts__["renderer"],
        __opts__["renderer_blacklist"],
        __opts__["renderer_whitelist"],
    )
