"""
Views для управления правами пользователей.
"""
from django.contrib.auth.mixins import LoginRequiredMixin
from django.contrib.auth.models import User
from django.contrib import messages
from django.http import JsonResponse
from django.shortcuts import render, get_object_or_404, redirect
from django.views import View

from ..models import CustomUser, UserPermission
from ..permissions import (
    PERMISSIONS, 
    DEFAULT_ROLE_PERMISSIONS, 
    PermissionRequiredMixin,
    has_permission
)


class UserPermissionsListView(LoginRequiredMixin, PermissionRequiredMixin, View):
    """Список пользователей с их правами."""
    permission_required = 'admin_access'
    
    def get(self, request):
        users = CustomUser.objects.select_related('user').prefetch_related(
            'user_permissions'
        ).order_by('user__username')
        
        context = {
            'users': users,
            'permissions': PERMISSIONS,
            'default_permissions': DEFAULT_ROLE_PERMISSIONS,
        }
        return render(request, 'mainapp/user_permissions_list.html', context)


class UserPermissionsEditView(LoginRequiredMixin, PermissionRequiredMixin, View):
    """Редактирование прав конкретного пользователя."""
    permission_required = 'admin_access'
    
    def get(self, request, pk):
        custom_user = get_object_or_404(CustomUser.objects.select_related('user'), pk=pk)
        
        # Получаем все разрешения
        all_permissions = UserPermission.objects.all()
        
        # Текущие разрешения пользователя
        user_perm_codes = set(custom_user.user_permissions.values_list('code', flat=True))
        
        # Права по умолчанию для роли
        default_perms = set(DEFAULT_ROLE_PERMISSIONS.get(custom_user.role, []))
        
        # Группируем разрешения по категориям
        permission_groups = {
            'Источники': [],
            'Заявки': [],
            'Точки ГЛ': [],
            'Спутники': [],
            'Транспондеры': [],
            'Тех. анализ': [],
            'Отметки': [],
            'Журнал ошибок': [],
            'Прочее': [],
        }
        
        for code, name, desc in PERMISSIONS:
            perm_data = {
                'code': code,
                'name': name,
                'description': desc,
                'has_permission': code in user_perm_codes if custom_user.use_custom_permissions else code in default_perms,
                'is_default': code in default_perms,
            }
            
            if code.startswith('source_'):
                permission_groups['Источники'].append(perm_data)
            elif code.startswith('request_'):
                permission_groups['Заявки'].append(perm_data)
            elif code.startswith('objitem_'):
                permission_groups['Точки ГЛ'].append(perm_data)
            elif code.startswith('satellite_'):
                permission_groups['Спутники'].append(perm_data)
            elif code.startswith('transponder_'):
                permission_groups['Транспондеры'].append(perm_data)
            elif code.startswith('tech_analyze_'):
                permission_groups['Тех. анализ'].append(perm_data)
            elif code.startswith('mark_'):
                permission_groups['Отметки'].append(perm_data)
            elif code.startswith('errors_report_'):
                permission_groups['Журнал ошибок'].append(perm_data)
            else:
                permission_groups['Прочее'].append(perm_data)
        
        context = {
            'custom_user': custom_user,
            'permission_groups': permission_groups,
            'default_perms': default_perms,
        }
        return render(request, 'mainapp/user_permissions_edit.html', context)
    
    def post(self, request, pk):
        custom_user = get_object_or_404(CustomUser, pk=pk)
        
        # Получаем выбранные разрешения
        selected_permissions = request.POST.getlist('permissions')
        use_custom = request.POST.get('use_custom_permissions') == 'on'
        
        # Обновляем флаг использования индивидуальных разрешений
        custom_user.use_custom_permissions = use_custom
        
        if use_custom:
            # Очищаем текущие разрешения и добавляем новые
            custom_user.user_permissions.clear()
            
            for perm_code in selected_permissions:
                perm, created = UserPermission.objects.get_or_create(code=perm_code)
                custom_user.user_permissions.add(perm)
        
        custom_user.save()
        
        messages.success(request, f'Права пользователя {custom_user.user.username} обновлены.')
        return redirect('mainapp:user_permissions_list')


class UserPermissionsApiView(LoginRequiredMixin, PermissionRequiredMixin, View):
    """API для управления правами пользователей."""
    permission_required = 'admin_access'
    
    def post(self, request, pk):
        """Обновление прав пользователя через AJAX."""
        import json
        
        try:
            data = json.loads(request.body)
            custom_user = get_object_or_404(CustomUser, pk=pk)
            
            use_custom = data.get('use_custom_permissions', False)
            permissions = data.get('permissions', [])
            
            custom_user.use_custom_permissions = use_custom
            
            if use_custom:
                custom_user.user_permissions.clear()
                for perm_code in permissions:
                    perm, _ = UserPermission.objects.get_or_create(code=perm_code)
                    custom_user.user_permissions.add(perm)
            
            custom_user.save()
            
            return JsonResponse({
                'success': True,
                'message': f'Права пользователя {custom_user.user.username} обновлены'
            })
        except Exception as e:
            return JsonResponse({
                'success': False,
                'error': str(e)
            }, status=400)



class InitPermissionsView(LoginRequiredMixin, PermissionRequiredMixin, View):
    """Инициализация всех разрешений в базе данных."""
    permission_required = 'admin_access'
    
    def get(self, request):
        from ..permissions import PERMISSIONS
        
        created_count = 0
        existing_count = 0
        
        for code, name, description in PERMISSIONS:
            perm, created = UserPermission.objects.get_or_create(code=code)
            if created:
                created_count += 1
            else:
                existing_count += 1
        
        messages.success(
            request, 
            f'Разрешения инициализированы. Создано: {created_count}, уже существовало: {existing_count}'
        )
        return redirect('mainapp:user_permissions_list')
