"""
    Forum defailt permissions
    =========================

    This module defines the default permissions that can be configured for a forum applications.

"""

from collections import OrderedDict

from django.utils.translation import ugettext_lazy as _


class PermissionConfig:
    """ Defines the supported forum permissions.

    This class defines the default configuration of forum permissions. It is used to create the
    related ``ForumPermission`` instances on a syncdb or migrate operation. Moreover the permission
    scopes are used in admin pages to display permission forms in a readable way.

    """

    permissions = [
        # Forums
        {
            'codename': 'can_see_forum',
            'label': _('Może widzieć forum'),
            'scope': 'forum',
        },
        {
            'codename': 'can_read_forum',
            'label': _('Może odczytać forum'),
            'scope': 'forum',
        },

        # Topics & posts
        {
            'codename': 'can_start_new_topics',
            'label': _('Może rozpocząć nowy temat'),
            'scope': 'conversation',
        },
        {
            'codename': 'can_reply_to_topics',
            'label': _('Może odpowiadać w temacie'),
            'scope': 'conversation',
        },
        {
            'codename': 'can_post_announcements',
            'label': _('Może dodawać ogłoszenia.'),
            'scope': 'conversation',
        },
        {
            'codename': 'can_post_stickies',
            'label': _('Może przyklejać tematy'),
            'scope': 'conversation',
        },
        {
            'codename': 'can_delete_own_posts',
            'label': _('Może usuwać własne posty'),
            'scope': 'conversation',
        },
        {
            'codename': 'can_edit_own_posts',
            'label': _('Może edytować własne posty'),
            'scope': 'conversation',
        },
        {
            'codename': 'can_post_without_approval',
            'label': _('Może dodawać posty bez zatwierdzenia'),
            'scope': 'conversation',
        },

        # Polls
        {
            'codename': 'can_create_polls',
            'label': _('Może dodawać głosowania'),
            'scope': 'polls',
        },
        {
            'codename': 'can_vote_in_polls',
            'label': _('Może głosować'),
            'scope': 'polls',
        },

        # Attachments
        {
            'codename': 'can_attach_file',
            'label': _('Może dodawać pliki'),
            'scope': 'attachments',
        },
        {
            'codename': 'can_download_file',
            'label': _('CMoże pobierać pliki'),
            'scope': 'attachments',
        },

        # Moderation
        {
            'codename': 'can_lock_topics',
            'label': _('Może zamykać tematy'),
            'scope': 'moderation',
        },
        {
            'codename': 'can_move_topics',
            'label': _('Może przenosić tematy'),
            'scope': 'moderation',
        },
        {
            'codename': 'can_edit_posts',
            'label': _('Może edytować posty'),
            'scope': 'moderation',
        },
        {
            'codename': 'can_delete_posts',
            'label': _('Może usuwać posty'),
            'scope': 'moderation',
        },
        {
            'codename': 'can_approve_posts',
            'label': _('Może potwierdzać posty'),
            'scope': 'moderation',
        },
        {
            'codename': 'can_reply_to_locked_topics',
            'label': _('Może dodawać posty w zamkniętych tematach'),
            'scope': 'moderation',
        },
    ]

    scopes = list(OrderedDict.fromkeys([p['scope'] for p in permissions]))

    def __getitem__(self, key):
        return self._permissions_dict[key]

    def get(self, key, default=None):
        return self._permissions_dict.get(key, default)

    @property
    def _permissions_dict(self):
        if not hasattr(self, '_permissions_per_codename'):
            self._permissions_per_codename = {p['codename']: p for p in self.permissions}
        return self._permissions_per_codename
