#

import json
import os
from importlib import import_module
from typing import Type

from django.conf import settings
from django.core.management.base import BaseCommand
from django.utils import timezone
from rolepermissions.roles import AbstractUserRole, RolesManager

from customrolepermissions.permissions import ALL_PERMISSIONS
from customrolepermissions.roles import permission_name_re


class Command(BaseCommand):
    def handle(self, *args, **options):
        data = [
            '$ manage.py dump_roles',
            '    dump of `{}` at {}'.format(settings.ROLEPERMISSIONS_MODULE, timezone.localtime()),
            '    this file is for representing only and not used in project.',
            '-' * 63,
        ]

        role: Type[AbstractUserRole]
        for role in sorted(RolesManager.get_roles(), key=lambda role: getattr(role, 'old_role_name', role.get_name())):
            data.append({
                'role': role.__name__,
                'role_name': role.get_name(),
                'old_role_name': getattr(role, 'old_role_name', role.get_name()),
                'available_permissions': dict((permission_name, bool(state)) for (permission_name, state) in sorted(
                    getattr(role, 'available_permissions', {}).items(),
                    key=lambda item: (not bool(item[1]), item[0]),
                )),
            })

        for permission_name in ALL_PERMISSIONS:
            if not permission_name_re.match(permission_name):
                print(f'not verified: {permission_name}')

        roles_module = import_module(settings.ROLEPERMISSIONS_MODULE)
        root, ext = os.path.splitext(roles_module.__file__)
        dump_filename = root + '.json'
        with open(dump_filename, 'w', encoding='utf-8') as fp:
            json.dump(data, fp, indent=2)
