from typing import Any, Dict, List

from django.apps import apps
from django.urls import reverse
from django.utils.functional import lazy
from django.utils.translation import ugettext_lazy as _


def _get_menu_entries() -> List[Dict[str, Any]]:
    """Build menu entries for all poster groups.

    This will include only poster groups where ``show_in_menu`` is enabled.
    """
    PosterGroup = apps.get_model("resint", "PosterGroup")
    return [
        {
            "name": group.name,
            "url": reverse("poster_show_current", args=[group.slug]),
            "icon": "picture_as_pdf",
            "validators": [
                (
                    "aleksis.apps.resint.rules.permission_validator",
                    "resint.view_poster_pdf_menu",
                    group,
                ),
            ],
        }
        for group in PosterGroup.objects.all()
    ]


get_menu_entries_lazy = lazy(_get_menu_entries, list)

MENUS = {
    "NAV_MENU_CORE": [
        {
            "name": _("Documents"),
            "url": "#",
            "icon": "open_in_browser",
            "root": True,
            "validators": [
                ("aleksis.core.util.predicates.permission_validator", "resint.view_poster_menu",),
            ],
            "submenu": [
                {
                    "name": _("Manage posters"),
                    "url": "poster_index",
                    "icon": "file_upload",
                    "validators": [
                        (
                            "aleksis.core.util.predicates.permission_validator",
                            "resint.view_posters_rule",
                        ),
                    ],
                },
                {
                    "name": _("Poster groups"),
                    "url": "poster_group_list",
                    "icon": "topic",
                    "validators": [
                        (
                            "aleksis.core.util.predicates.permission_validator",
                            "resint.view_postergroups_rule",
                        ),
                    ],
                },
                {
                    "name": _("Live documents"),
                    "url": "live_documents",
                    "icon": "update",
                    "validators": [
                        (
                            "aleksis.core.util.predicates.permission_validator",
                            "resint.view_livedocuments_rule",
                        ),
                    ],
                },
            ],
        }
    ]
    + get_menu_entries_lazy(),
}