import re

from ansiblelater.standard import StandardBase


class CheckFilterSeparation(StandardBase):

    sid = "ANSIBLE0016"
    description = "Jinja2 filters should be separated with spaces"
    helptext = "no suitable numbers of spaces (required: 1)"
    version = "0.1"
    types = ["playbook", "task", "handler", "rolevars", "hostvars", "groupvars"]

    def check(self, candidate, settings):
        yamllines, errors = self.get_normalized_yaml(candidate, settings)

        matches = []
        braces = re.compile("{{(.*?)}}")
        filters = re.compile(r"(?<=\|)((\s{2,})*\S+)|(\S+(\s{2,})*)(?=\|)")

        if not errors:
            for i, line in yamllines:
                match = braces.findall(line)
                if match:
                    for item in match:
                        # replace potential regex in filters
                        item = re.sub(r"\(.+\)", "(dummy)", item)
                        matches.append((i, item))

            for i, item in matches:
                if filters.findall(item):
                    errors.append(self.Error(i, self.helptext))
        return self.Result(candidate.path, errors)
