from django.views.generic import TemplateView

from dashboard.models import Dashboard
from dashboard.widget_pool import get_widget


class DashboardView(TemplateView):
    """ View to display a named dashboard """
    template_name = "dashboard/dashboard.html"

    def get_context_data(self, **kwargs):
        """ Get the list of widgets for this dashboard, and organise them
            in row/columns to be displayed by the template.
        """
        context = super(DashboardView, self).get_context_data(**kwargs) or {}

        # Get dashboard
        if 'name' in self.kwargs and self.kwargs['name']:
            name = self.kwargs['name']
        else:
            name = 'main'
        dashboard = Dashboard.objects.get(name=name)
        context['name'] = dashboard.name

        # Get widgets and sort them by row
        widgets = dashboard.widgetinstance_set.all().order_by('row', 'column')
        context['rows'] = []
        current_row = []
        current_row_number = None
        for widget in widgets:
            if current_row_number is None:
                current_row_number = widget.row
            elif current_row_number != widget.row:
                context['rows'].append(current_row)
                current_row_number = widget.row
                current_row = []
            current_row.append(widget)
        if len(current_row) > 0:
            context['rows'].append(current_row)

        # Get all the javascript & css dependencies
        context['javascript'] = []
        context['css'] = ['dashboard/dashboard.css']
        for widget in widgets:
            widget_type = get_widget(widget.widget_type)
            if hasattr(widget_type, 'javascript'):
                context['javascript'] += widget_type.javascript
            if hasattr(widget_type, 'css'):
                context['css'] += widget_type.css
        context['javascript'] = self._remove_duplicates(context['javascript'])
        context['css'] = self._remove_duplicates(context['css'])

        # Return the context
        return context

    def _remove_duplicates(self, the_list):
        """ Remove duplicates whilst preseving order """
        out = []
        for e in the_list:
            if e not in out:
                out.append(e)
        return out