# coding: utf-8
"""
jinja2schema.config
~~~~~~~~~~~~~~~~~~~
"""
from .order_number import OrderNumber


class Config(object):
    """Configuration."""

    TYPE_OF_VARIABLE_INDEXED_WITH_VARIABLE_TYPE = 'dictionary'
    """Possible values: ``"dictionary"`` or ``"list""``.

    For example, in the expression ``xs[a]`` variable ``xs`` may be a list as well as a dictionary.
    This setting is used to choose between a dictionary and a list when the variable is
    being indexed with another variable.
    """

    TYPE_OF_VARIABLE_INDEXED_WITH_INTEGER_TYPE = 'list'
    """Possible values: ``"dictionary"``, ``"list"`` or ``"tuple"``.

    For example, in the expression ``xs[2]`` variable ``xs`` may be a list as well as a dictionary or a tuple.
    This setting is used to choose between a dictionary, a tuple and a list when the variable is
    being indexed with an integer.
    """

    BOOLEAN_CONDITIONS = False
    """Whether or not to consider conditions in ``if`` statements as boolean.

    If this variable is not set, ``xs`` variable in template ``{% if xs %}{% endif %}`` will have
    unknown structure. If this variable is set, ``xs`` will be a boolean.
    """

    PACKAGE_NAME = ''
    """Name of the package where you want to load templates from.

    This configuration is for if you are using includes in your jinja templates. This tells jinja
    where to look to be able to load the included template from. If you do not plan on using ``includes``
    this configuration is not needed.
    """

    TEMPLATE_DIR = 'templates'
    """Name of the directory where you want to load templates from. Defaulted to ``templates``

    This configuration is for if you are using includes in your jinja templates. This tells jinja
    which directoy to look to be able to load the included template from. If you do not plan on using ``includes``
    this configuration is not needed.
    """

    ORDER_NUMBER = False
    """Add a order number to each node

    Add a order number to make schema sortable.
    """

    ORDER_NUMBER_SUB_COUNTER = True
    """Independent subsection order numbers

    Use a separate counter in subsections as order number creator.
    """

    IGNORE_UNKNOWN_FILTERS = False
    """Ignore unknown filters
    
    Can be True to ignore all unknown filters, False (by default, to keep the original behavior), or a list
    (set or tuple) containing the filter names to ignore.
    
    Those filters will always accept Unknown and return Unknown.
    """

    def __init__(self,
                 TYPE_OF_VARIABLE_INDEXED_WITH_VARIABLE_TYPE='dictionary',
                 TYPE_OF_VARIABLE_INDEXED_WITH_INTEGER_TYPE='list',
                 BOOLEAN_CONDITIONS=False,
                 PACKAGE_NAME='',
                 TEMPLATE_DIR='templates',
                 ORDER_NUMBER=False,
                 ORDER_NUMBER_SUB_COUNTER=True,
                 IGNORE_UNKNOWN_FILTERS=False):
        if TYPE_OF_VARIABLE_INDEXED_WITH_VARIABLE_TYPE not in ('dictionary', 'list'):
            raise ValueError('TYPE_OF_VARIABLE_INDEXED_WITH_VARIABLE_TYPE must be'
                             'either "dictionary" or "list"')
        if TYPE_OF_VARIABLE_INDEXED_WITH_INTEGER_TYPE not in ('dictionary', 'list', 'tuple'):
            raise ValueError('TYPE_OF_VARIABLE_INDEXED_WITH_VARIABLE_TYPE must be'
                             'either "dictionary", "tuple" or "list"')
        self.TYPE_OF_VARIABLE_INDEXED_WITH_INTEGER_TYPE = TYPE_OF_VARIABLE_INDEXED_WITH_INTEGER_TYPE
        self.TYPE_OF_VARIABLE_INDEXED_WITH_VARIABLE_TYPE = TYPE_OF_VARIABLE_INDEXED_WITH_VARIABLE_TYPE
        self.BOOLEAN_CONDITIONS = BOOLEAN_CONDITIONS
        self.PACKAGE_NAME = PACKAGE_NAME
        self.TEMPLATE_DIR = TEMPLATE_DIR
        self.ORDER_NUMBER = ORDER_NUMBER
        self.ORDER_OBJECT = OrderNumber(number=1, enabled=self.ORDER_NUMBER,
                                        sub_counter_enabled=ORDER_NUMBER_SUB_COUNTER)
        self.IGNORE_UNKNOWN_FILTERS = IGNORE_UNKNOWN_FILTERS


default_config = Config()
