from django.urls import reverse
from django.utils.translation import gettext_lazy as _
from fluent_dashboard import dashboard, appsettings
from fluent_dashboard.modules import CmsAppIconList

from orchestra.core import services, accounts, administration


class AppDefaultIconList(CmsAppIconList):
    """ Provides support for custom default icons """
    def __init__(self, *args, **kwargs):
        self.icons = kwargs.pop('icons')
        super(AppDefaultIconList, self).__init__(*args, **kwargs)

    def get_icon_for_model(self, app_name, model_name, default=None):
        icon = self.icons.get('.'.join((app_name, model_name)))
        return super(AppDefaultIconList, self).get_icon_for_model(app_name, model_name, default=icon)


class OrchestraIndexDashboard(dashboard.FluentIndexDashboard):
    """ Gets application modules from services, accounts and administration registries """

    def __init__(self, **kwargs):
        super(dashboard.FluentIndexDashboard, self).__init__(**kwargs)
        self.children.append(self.get_personal_module())
        self.children.extend(self.get_application_modules())
        recent_actions = self.get_recent_actions_module()
        recent_actions.enabled = True
        self.children.append(recent_actions)

    def process_registered_view(self, module, view_name, options):
        app_name, name = view_name.split('_')[:-1]
        module.icons['.'.join((app_name, name))] = options.get('icon')
        url = reverse('admin:' + view_name)
        add_url = '/'.join(url.split('/')[:-2])
        module.children.append({
            'models': [
                {
                    'add_url': add_url,
                    'app_name': app_name,
                    'change_url': url,
                    'name': name,
                    'title': options.get('verbose_name_plural')
                }
            ],
            'name': app_name,
            'title': options.get('verbose_name_plural'),
            'url': add_url,
        })

    def get_application_modules(self):
        modules = []
        # Honor settings override, hacky. I Know
        if appsettings.FLUENT_DASHBOARD_APP_GROUPS[0][0] != _('CMS'):
            modules = super(OrchestraIndexDashboard, self).get_application_modules()
        for register in (accounts, services, administration):
            title = register.verbose_name
            models = []
            icons = {}
            views = []
            for model, options in register.get().items():
                if isinstance(model, str):
                    views.append((model, options))
                elif options.get('dashboard', True):
                    opts = model._meta
                    label = "%s.%s" % (model.__module__, opts.object_name)
                    models.append(label)
                    label = '.'.join((opts.app_label, opts.model_name))
                    icons[label] = options.get('icon')
            module = AppDefaultIconList(title, models=models, icons=icons, collapsible=True)
            for view_name, options in views:
                self.process_registered_view(module, view_name, options)
            modules.append(module)
        return modules