"""
Created on Oct 12, 2013

@author: Daniel Gaspar
"""

import logging

from flask.globals import _request_ctx_stack

from ._compat import as_unicode


log = logging.getLogger(__name__)


class RenderTemplateWidget(object):
    """
    Base template for every widget
    Enables the possibility of rendering a template
     inside a template with run time options
    """

    template = "appbuilder/general/widgets/render.html"
    template_args = None

    def __init__(self, **kwargs):
        self.template_args = kwargs

    def __call__(self, **kwargs):
        ctx = _request_ctx_stack.top
        jinja_env = ctx.app.jinja_env

        template = jinja_env.get_template(self.template)
        args = self.template_args.copy()
        args.update(kwargs)
        return template.render(args)


class FormWidget(RenderTemplateWidget):
    """
    FormWidget

    form = None
    include_cols = []
    exclude_cols = []
    fieldsets = []
    """

    template = "appbuilder/general/widgets/form.html"


class FormVerticalWidget(RenderTemplateWidget):
    """
    FormWidget

    form = None
    include_cols = []
    exclude_cols = []
    fieldsets = []
    """

    template = "appbuilder/general/widgets/form_vertical.html"


class FormHorizontalWidget(RenderTemplateWidget):
    """
    FormWidget

    form = None
    include_cols = []
    exclude_cols = []
    fieldsets = []
    """

    template = "appbuilder/general/widgets/form_horizontal.html"


class FormInlineWidget(RenderTemplateWidget):
    """
    FormWidget

    form = None
    include_cols = []
    exclude_cols = []
    fieldsets = []
    """

    template = "appbuilder/general/widgets/form_inline.html"


class GroupFormListWidget(RenderTemplateWidget):
    template = "appbuilder/general/widgets/group_form_list.html"


class SearchWidget(FormWidget):
    template = "appbuilder/general/widgets/search.html"
    filters = None

    def __init__(self, **kwargs):
        self.filters = kwargs.get("filters")
        return super(SearchWidget, self).__init__(**kwargs)

    def __call__(self, **kwargs):
        """create dict labels based on form"""
        """ create dict of form widgets """
        """ create dict of possible filters """
        """ create list of active filters """
        label_columns = {}
        form_fields = {}
        search_filters = {}
        dict_filters = self.filters.get_search_filters()
        for col in self.template_args["include_cols"]:
            label_columns[col] = as_unicode(self.template_args["form"][col].label.text)
            form_fields[col] = self.template_args["form"][col]()
            search_filters[col] = [as_unicode(flt.name) for flt in dict_filters[col]]

        kwargs["label_columns"] = label_columns
        kwargs["form_fields"] = form_fields
        kwargs["search_filters"] = search_filters
        kwargs["active_filters"] = self.filters.get_filters_values_tojson()
        return super(SearchWidget, self).__call__(**kwargs)


class ShowWidget(RenderTemplateWidget):
    """
    ShowWidget implements a template as an widget
    it takes the following arguments

    pk = None
    label_columns = []
    include_columns = []
    value_columns = []
    actions = None
    fieldsets = []
    modelview_name = ''
    """

    template = "appbuilder/general/widgets/show.html"


class ShowBlockWidget(RenderTemplateWidget):
    template = "appbuilder/general/widgets/show_block.html"


class ShowVerticalWidget(RenderTemplateWidget):
    template = "appbuilder/general/widgets/show_vertical.html"


class ListWidget(RenderTemplateWidget):
    """
    List Widget implements a Template as an widget.
    It takes the following arguments

    label_columns = []
    include_columns = []
    value_columns = []
    order_columns = []
    page = None
    page_size = None
    count = 0
    pks = []
    actions = None
    filters = {}
    modelview_name = ''
    """

    template = "appbuilder/general/widgets/list.html"


class ListMasterWidget(ListWidget):
    template = "appbuilder/general/widgets/list_master.html"


class ListAddWidget(ListWidget):
    template = "appbuilder/general/widgets/list_add.html"

    def __init__(self, **kwargs):
        super(ListAddWidget, self).__init__(**kwargs)

    def __call__(self, **kwargs):
        return super(ListAddWidget, self).__call__(**kwargs)


class ListThumbnail(ListWidget):
    template = "appbuilder/general/widgets/list_thumbnail.html"


class ListLinkWidget(ListWidget):
    template = "appbuilder/general/widgets/list_link.html"


class ListCarousel(ListWidget):
    template = "appbuilder/general/widgets/list_carousel.html"


class ListItem(ListWidget):
    template = "appbuilder/general/widgets/list_item.html"


class ListBlock(ListWidget):
    template = "appbuilder/general/widgets/list_block.html"
