from django.conf import settings
from django.contrib.auth.models import Group, Permission, User
from django.contrib.contenttypes.models import ContentType
from django.core.management.base import BaseCommand

from financial_settlement.models import FinStatement
from semantics.models import Frame
from users.models import Assignment, Note


class Command(BaseCommand):
    def handle(self, **options):
        Permission.objects.update_or_create(
            content_type=ContentType.objects.get_for_model(Note),
            codename="view_all_notes",
            defaults={"name": "View all Notes"}
        )
        Permission.objects.update_or_create(
            content_type=ContentType.objects.get_for_model(Frame),
            codename="manage_invalid_lexical_units",
            defaults={"name": "Manage invalid Lexical Units"}
        )
        admins, __ = Group.objects.get_or_create(name='Admini')
        admins.permissions.add(
            self._get_permission(User, 'view_user'),
            self._get_permission(User, 'add_user'),
            self._get_permission(User, 'change_user'),
            self._get_permission(User, 'delete_user'),
            self._get_permission(Assignment, 'view_assignment'),
            self._get_permission(Note, 'view_all_notes'),
            self._get_permission(Frame, 'manage_invalid_lexical_units'),
            self._get_permission(FinStatement, 'edit_statement'),
            self._get_permission(FinStatement, 'add_statement'),
        )
        lexicographs, __ = Group.objects.get_or_create(name='Leksykografowie')
        lexicographs.permissions.add(
            # TODO
        )
        super_lexicographs, __ = Group.objects.get_or_create(name=settings.SUPER_LEXICOGRAPHS_GROUP_NAME)
        super_lexicographs.permissions.add(
            self._get_permission(Assignment, 'view_assignment'),
            self._get_permission(Note, 'view_all_notes'),
            self._get_permission(Frame, 'manage_invalid_lexical_units'),
        )

    def _get_permission(self, model, codename) -> Permission:
        return Permission.objects.get(codename=codename, content_type=ContentType.objects.get_for_model(model))