# -*- coding: utf-8 -*-
"""
Adtlas Accounts Views

This module contains all views for the accounts app including user management,
authentication, profiles, roles, and user activities.

Author: Adtlas Development Team
Version: 2.0.0
Last Updated: 2025-01-20
"""

from django.shortcuts import render, get_object_or_404, redirect
from django.contrib.auth import authenticate, login, logout, update_session_auth_hash
from django.contrib.auth.decorators import login_required
from django.contrib.auth.mixins import LoginRequiredMixin, PermissionRequiredMixin
from django.contrib import messages
from django.core.paginator import Paginator
from django.db.models import Q, Count
from django.http import JsonResponse, HttpResponseRedirect
from django.urls import reverse_lazy, reverse
from django.utils import timezone
from django.views.generic import (
    ListView, DetailView, CreateView, UpdateView, DeleteView,
    TemplateView, FormView, View
)
from django.views.decorators.http import require_http_methods
from django.views.decorators.csrf import csrf_exempt
from django.utils.decorators import method_decorator
from django.core.exceptions import PermissionDenied
from django.db import transaction
import json
from django.views.decorators.http import require_POST, require_GET
import pytz

from .models import (
    User, Profile, Department, Role, UserRole, Permission, UserSession,
    PasswordResetToken
)
from .forms import ProfileUpdateForm, CustomPasswordChangeForm, UserCreateForm, UserUpdateForm
from apps.activities.helpers import log_user_activity
from apps.activities.models import Activity
from apps.common.decorators import ajax_required
from apps.common.permissions import has_permission


# ============================================================================
# Authentication Views
# ============================================================================

class LoginView(TemplateView):
    """Custom login view."""
    template_name = 'accounts/login.html'
    
    def get(self, request, *args, **kwargs):
        if request.user.is_authenticated:
            return redirect('core:dashboard')
        return super().get(request, *args, **kwargs)
    
    def post(self, request, *args, **kwargs):
        email = request.POST.get('email')
        password = request.POST.get('password')
        remember_me = request.POST.get('remember_me')
        
        if email and password:
            user = authenticate(request, username=email, password=password)
            if user is not None:
                if user.is_active:
                    login(request, user)
                    
                    # Set session expiry
                    if not remember_me:
                        request.session.set_expiry(0)
                    
                    # Update last login IP
                    ip_address = self.get_client_ip(request)
                    user.update_last_login_ip(ip_address)
                    
                    # Log activity
                    log_user_activity(
                        user=user,
                        action='login',
                        ip_address=ip_address,
                        user_agent=request.META.get('HTTP_USER_AGENT', '')
                    )
                    
                    next_url = request.GET.get('next', 'core:dashboard')
                    return redirect(next_url)
                else:
                    messages.error(request, 'Your account is inactive.')
            else:
                messages.error(request, 'Invalid email or password.')
        else:
            messages.error(request, 'Please provide both email and password.')
        
        return self.get(request, *args, **kwargs)
    
    def get_client_ip(self, request):
        """Get client IP address."""
        x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR')
        if x_forwarded_for:
            ip = x_forwarded_for.split(',')[0]
        else:
            ip = request.META.get('REMOTE_ADDR')
        return ip


class LogoutView(LoginRequiredMixin, View):
    """Logout view."""
    
    def get(self, request):
        # Log activity
        log_user_activity(
            user=request.user,
            action='logout',
            ip_address=request.META.get('REMOTE_ADDR'),
            user_agent=request.META.get('HTTP_USER_AGENT', '')
        )
        
        logout(request)
        messages.success(request, 'You have been logged out successfully.')
        return redirect('accounts:login')


# ============================================================================
# Profile Views (Class-Based)
# ============================================================================

class ProfileView(LoginRequiredMixin, TemplateView):
    """Display user profile."""
    template_name = 'accounts/profile.html'
    
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        profile, created = Profile.objects.get_or_create(user=self.request.user)
        
        # Get user roles
        user_roles = UserRole.objects.filter(
            user=self.request.user, is_active=True
        ).select_related('role')
        
        # Get recent activities
        recent_activities = Activity.objects.filter(
            user=self.request.user
        ).order_by('-created_at')[:5]
        
        # Get active sessions
        active_sessions = UserSession.objects.filter(
            user=self.request.user, is_active=True
        ).order_by('-last_activity')[:5]
        
        # Calculate profile completion percentage
        completion_percentage = self.calculate_profile_completion(profile)
        
        # Get departments for form
        departments = Department.objects.filter(is_active=True)
        
        # Get timezone choices
        timezone_choices = [(tz, tz) for tz in pytz.common_timezones]
        
        # Get language choices
        language_choices = [
            ('en', 'English'),
            ('es', 'Spanish'),
            ('fr', 'French'),
            ('de', 'German'),
            ('it', 'Italian'),
            ('pt', 'Portuguese'),
            ('ru', 'Russian'),
            ('ja', 'Japanese'),
            ('ko', 'Korean'),
            ('zh', 'Chinese'),
        ]
        
        # Get theme choices
        theme_choices = [
            ('light', 'Light'),
            ('dark', 'Dark'),
            ('auto', 'Auto'),
        ]
        
        context.update({
            'profile': profile,
            'user_roles': user_roles,
            'recent_activities': recent_activities,
            'active_sessions': active_sessions,
            'completion_percentage': completion_percentage,
            'departments': departments,
            'timezone_choices': timezone_choices,
            'language_choices': language_choices,
            'theme_choices': theme_choices,
        })
        
        return context
    
    def calculate_profile_completion(self, profile):
        """Calculate profile completion percentage."""
        fields = [
            'avatar', 'phone_number', 'job_title', 'department', 'bio',
            'website', 'timezone', 'language'
        ]
        
        completed_fields = 0
        total_fields = len(fields)
        
        for field in fields:
            value = getattr(profile, field, None)
            if value:
                completed_fields += 1
        
        # Also check user fields
        user_fields = ['first_name', 'last_name']
        for field in user_fields:
            value = getattr(profile.user, field, None)
            if value:
                completed_fields += 1
        
        total_fields += len(user_fields)
        
        return int((completed_fields / total_fields) * 100)


class ProfileEditView(LoginRequiredMixin, View):
    """Edit user profile."""
    
    def get(self, request):
        profile, created = Profile.objects.get_or_create(user=request.user)
        form = ProfileUpdateForm(instance=profile, user=request.user)
        
        context = {
            'form': form,
            'profile': profile,
            'departments': Department.objects.filter(is_active=True)
        }
        
        return render(request, 'accounts/profile_edit.html', context)
    
    def post(self, request):
        profile, created = Profile.objects.get_or_create(user=request.user)
        form = ProfileUpdateForm(request.POST, request.FILES, instance=profile, user=request.user)
        
        if form.is_valid():
            form.save()
            
            # Log activity
            log_user_activity(
                user=request.user,
                action='update',
                object_type='Profile',
                object_id=str(profile.id),
                object_repr='Profile updated'
            )
            
            messages.success(request, 'Profile updated successfully.')
            return redirect('accounts:profile')
        
        context = {
            'form': form,
            'profile': profile,
            'departments': Department.objects.filter(is_active=True)
        }
        
        return render(request, 'accounts/profile_edit.html', context)


class ChangePasswordView(LoginRequiredMixin, View):
    """Change user password."""
    
    def get(self, request):
        form = CustomPasswordChangeForm(request.user)
        return render(request, 'accounts/change_password.html', {'form': form})
    
    def post(self, request):
        form = CustomPasswordChangeForm(request.user, request.POST)
        if form.is_valid():
            user = form.save()
            user.password_changed_at = timezone.now()
            user.save()
            
            update_session_auth_hash(request, user)
            
            # Log activity
            log_user_activity(
                user=request.user,
                action='update',
                object_type='User',
                object_id=str(user.id),
                object_repr='Password changed'
            )
            
            messages.success(request, 'Password changed successfully.')
            return redirect('accounts:profile')
        
        return render(request, 'accounts/change_password.html', {'form': form})


class SettingsView(LoginRequiredMixin, TemplateView):
    """User settings view."""
    template_name = 'accounts/settings.html'
    
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        profile, created = Profile.objects.get_or_create(user=self.request.user)
        
        context.update({
            'profile': profile,
            'user': self.request.user,
        })
        
        return context


# ============================================================================
# API Views (Class-Based)
# ============================================================================

class ProfileUpdateAPIView(LoginRequiredMixin, View):
    """API for updating user profile."""
    
    def post(self, request):
        try:
            profile, created = Profile.objects.get_or_create(user=request.user)
            form = ProfileUpdateForm(request.POST, request.FILES, instance=profile, user=request.user)
            
            if form.is_valid():
                form.save()
                
                # Log activity
                log_user_activity(
                    user=request.user,
                    action='update',
                    object_type='Profile',
                    object_id=str(profile.id),
                    object_repr='Profile updated via API'
                )
                
                return JsonResponse({
                    'success': True,
                    'message': 'Profile updated successfully'
                })
            else:
                return JsonResponse({
                    'success': False,
                    'message': 'Profile update failed',
                    'errors': form.errors
                })
        except Exception as e:
            return JsonResponse({
                'success': False,
                'message': f'An error occurred: {str(e)}'
            })


class ChangePasswordAPIView(LoginRequiredMixin, View):
    """API for changing user password."""
    
    def post(self, request):
        try:
            form = CustomPasswordChangeForm(request.user, request.POST)
            
            if form.is_valid():
                user = form.save()
                user.password_changed_at = timezone.now()
                user.save()
                
                update_session_auth_hash(request, user)
                
                # Log activity
                log_user_activity(
                    user=request.user,
                    action='update',
                    object_type='User',
                    object_id=str(user.id),
                    object_repr='Password changed via API'
                )
                
                return JsonResponse({
                    'success': True,
                    'message': 'Password changed successfully'
                })
            else:
                return JsonResponse({
                    'success': False,
                    'message': 'Password change failed',
                    'errors': form.errors
                })
        except Exception as e:
            return JsonResponse({
                'success': False,
                'message': f'An error occurred: {str(e)}'
            })


class UserSessionsAPIView(LoginRequiredMixin, View):
    """API for fetching user sessions."""
    
    def get(self, request):
        try:
            sessions = UserSession.objects.filter(user=request.user)
            
            session_data = []
            for session in sessions:
                session_data.append({
                    'id': session.id,
                    'session_key': session.session_key[:20] + '...' if len(session.session_key) > 20 else session.session_key,
                    'ip_address': session.ip_address,
                    'user_agent': session.user_agent[:50] + '...' if len(session.user_agent) > 50 else session.user_agent,
                    'location': session.location or 'Unknown',
                    'last_activity': session.last_activity.strftime('%Y-%m-%d %H:%M:%S') if session.last_activity else 'Unknown',
                    'is_current': session.session_key == request.session.session_key,
                    'is_active': session.is_active
                })
            
            return JsonResponse({
                'success': True,
                'sessions': session_data
            })
        except Exception as e:
            return JsonResponse({
                'success': False,
                'message': f'An error occurred: {str(e)}'
            })


class UserActivitiesAPIView(LoginRequiredMixin, View):
    """API for fetching user activities."""
    
    def get(self, request):
        try:
            action = request.GET.get('action', '')
            search = request.GET.get('search', '')
            per_page = int(request.GET.get('per_page', 20))
            
            activities = Activity.objects.filter(user=request.user)
            
            if action:
                activities = activities.filter(action=action)
            
            if search:
                activities = activities.filter(
                    Q(object_repr__icontains=search) |
                    Q(object_type__icontains=search)
                )
            
            activities = activities.order_by('-created_at')[:per_page]
            
            activity_data = []
            for activity in activities:
                activity_data.append({
                    'id': activity.id,
                    'action': activity.action,
                    'object_type': activity.object_type,
                    'object_repr': activity.object_repr,
                    'created_at': activity.created_at.strftime('%Y-%m-%d %H:%M:%S'),
                    'ip_address': activity.ip_address
                })
            
            return JsonResponse({
                'success': True,
                'activities': activity_data
            })
        except Exception as e:
            return JsonResponse({
                'success': False,
                'message': f'An error occurred: {str(e)}'
            })


class TerminateSessionAPIView(LoginRequiredMixin, View):
    """API for terminating user sessions."""
    
    def post(self, request):
        try:
            session_id = request.POST.get('session_id')
            
            if not session_id:
                return JsonResponse({
                    'success': False,
                    'message': 'Session ID is required'
                })
            
            session = UserSession.objects.get(
                id=session_id,
                user=request.user,
                is_active=True
            )
            
            # Don't allow terminating current session
            if session.session_key == request.session.session_key:
                return JsonResponse({
                    'success': False,
                    'message': 'Cannot terminate current session'
                })
            
            session.is_active = False
            session.save()
            
            # Log activity
            log_user_activity(
                user=request.user,
                action='delete',
                object_type='UserSession',
                object_id=str(session.id),
                object_repr='Session terminated'
            )
            
            return JsonResponse({
                'success': True,
                'message': 'Session terminated successfully'
            })
            
        except UserSession.DoesNotExist:
            return JsonResponse({
                'success': False,
                'message': 'Session not found'
            })
        except Exception as e:
            return JsonResponse({
                'success': False,
                'message': f'An error occurred: {str(e)}'
            })


# ============================================================================
# User Management Views (Class-Based)
# ============================================================================

class UserListView(LoginRequiredMixin, ListView):
    """List all users with search and filtering."""
    model = User
    template_name = 'accounts/user_list.html'
    context_object_name = 'users'
    paginate_by = 25
    
    def get_queryset(self):
        queryset = User.objects.select_related('profile__department').prefetch_related('userrole_set__role')
        
        # Search functionality
        search = self.request.GET.get('search')
        if search:
            queryset = queryset.filter(
                Q(email__icontains=search) |
                Q(first_name__icontains=search) |
                Q(last_name__icontains=search) |
                Q(username__icontains=search)
            )
        
        # Filter by department
        department = self.request.GET.get('department')
        if department:
            queryset = queryset.filter(profile__department_id=department)
        
        # Filter by role
        role = self.request.GET.get('role')
        if role:
            queryset = queryset.filter(userrole__role_id=role, userrole__is_active=True)
        
        # Filter by status
        status = self.request.GET.get('status')
        if status == 'active':
            queryset = queryset.filter(is_active=True)
        elif status == 'inactive':
            queryset = queryset.filter(is_active=False)
        elif status == 'verified':
            queryset = queryset.filter(is_verified=True)
        elif status == 'unverified':
            queryset = queryset.filter(is_verified=False)
        
        return queryset.order_by('-date_joined')
    
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['departments'] = Department.objects.filter(is_active=True)
        context['roles'] = Role.objects.filter(is_active=True)
        context['search'] = self.request.GET.get('search', '')
        context['selected_department'] = self.request.GET.get('department', '')
        context['selected_role'] = self.request.GET.get('role', '')
        context['selected_status'] = self.request.GET.get('status', '')
        return context


class UserDetailView(LoginRequiredMixin, DetailView):
    """Display user details."""
    model = User
    template_name = 'accounts/user_detail.html'
    context_object_name = 'user_obj'
    
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        user = self.get_object()
        
        # Get user roles
        context['user_roles'] = UserRole.objects.filter(
            user=user, is_active=True
        ).select_related('role')
        
        # Get recent activities
        context['recent_activities'] = Activity.objects.filter(
            user=user
        ).order_by('-created_at')[:10]
        
        # Get active sessions
        context['active_sessions'] = UserSession.objects.filter(
            user=user, is_active=True
        ).order_by('-last_activity')[:5]
        
        return context


class UserCreateView(LoginRequiredMixin, CreateView):
    """Create new user."""
    model = User
    form_class = UserCreateForm
    template_name = 'accounts/user_form.html'
    success_url = reverse_lazy('accounts:user_list')
    
    def form_valid(self, form):
        user = form.save()
        
        # Create profile
        Profile.objects.create(user=user)
        
        # Log activity
        log_user_activity(
            user=self.request.user,
            action='create',
            object_type='User',
            object_id=str(user.id),
            object_repr=str(user)
        )
        
        messages.success(self.request, f'User {user.email} created successfully.')
        return super().form_valid(form)


class UserUpdateView(LoginRequiredMixin, UpdateView):
    """Update user information."""
    model = User
    form_class = UserUpdateForm
    template_name = 'accounts/user_form.html'
    
    def get_success_url(self):
        return reverse('accounts:user_detail', kwargs={'pk': self.object.pk})
    
    def form_valid(self, form):
        # Log activity
        log_user_activity(
            user=self.request.user,
            action='update',
            object_type='User',
            object_id=str(self.object.id),
            object_repr=str(self.object)
        )
        
        messages.success(self.request, 'User updated successfully.')
        return super().form_valid(form)


class UserDeleteView(LoginRequiredMixin, DeleteView):
    """Delete user (soft delete)."""
    model = User
    template_name = 'accounts/user_confirm_delete.html'
    success_url = reverse_lazy('accounts:user_list')
    
    def delete(self, request, *args, **kwargs):
        user = self.get_object()
        
        # Soft delete - deactivate user
        user.is_active = False
        user.save()
        
        # Log activity
        log_user_activity(
            user=request.user,
            action='delete',
            object_type='User',
            object_id=str(user.id),
            object_repr=str(user)
        )
        
        messages.success(request, f'User {user.email} deactivated successfully.')
        return HttpResponseRedirect(self.success_url)


# ============================================================================
# Department Views (Class-Based)
# ============================================================================

class DepartmentListView(LoginRequiredMixin, ListView):
    """List all departments."""
    model = Department
    template_name = 'accounts/department_list.html'
    context_object_name = 'departments'
    paginate_by = 20
    
    def get_queryset(self):
        queryset = Department.objects.select_related('head', 'parent')
        
        search = self.request.GET.get('search')
        if search:
            queryset = queryset.filter(
                Q(name__icontains=search) |
                Q(code__icontains=search) |
                Q(description__icontains=search)
            )
        
        return queryset.order_by('name')


class DepartmentDetailView(LoginRequiredMixin, DetailView):
    """Display department details."""
    model = Department
    template_name = 'accounts/department_detail.html'
    context_object_name = 'department'
    
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        department = self.get_object()
        
        # Get department users
        context['users'] = User.objects.filter(
            profile__department=department
        ).select_related('profile')
        
        # Get child departments
        context['child_departments'] = department.children.filter(is_active=True)
        
        return context


class DepartmentCreateView(LoginRequiredMixin, CreateView):
    """Create new department."""
    model = Department
    template_name = 'accounts/department_form.html'
    fields = ['name', 'code', 'description', 'parent', 'head', 'is_active']
    success_url = reverse_lazy('accounts:department_list')
    
    def form_valid(self, form):
        messages.success(self.request, 'Department created successfully.')
        return super().form_valid(form)


class DepartmentUpdateView(LoginRequiredMixin, UpdateView):
    """Update department."""
    model = Department
    template_name = 'accounts/department_form.html'
    fields = ['name', 'code', 'description', 'parent', 'head', 'is_active']
    
    def get_success_url(self):
        return reverse('accounts:department_detail', kwargs={'pk': self.object.pk})
    
    def form_valid(self, form):
        messages.success(self.request, 'Department updated successfully.')
        return super().form_valid(form)


class DepartmentDeleteView(LoginRequiredMixin, DeleteView):
    """Delete department."""
    model = Department
    template_name = 'accounts/department_confirm_delete.html'
    success_url = reverse_lazy('accounts:department_list')
    
    def delete(self, request, *args, **kwargs):
        messages.success(self.request, 'Department deleted successfully.')
        return super().delete(request, *args, **kwargs)


# ============================================================================
# Role Management Views (Class-Based)
# ============================================================================

class RoleListView(LoginRequiredMixin, ListView):
    """List all roles."""
    model = Role
    template_name = 'accounts/role_list.html'
    context_object_name = 'roles'
    paginate_by = 20
    
    def get_queryset(self):
        queryset = Role.objects.prefetch_related('permissions')
        
        search = self.request.GET.get('search')
        if search:
            queryset = queryset.filter(
                Q(name__icontains=search) |
                Q(code__icontains=search) |
                Q(description__icontains=search)
            )
        
        role_type = self.request.GET.get('role_type')
        if role_type:
            queryset = queryset.filter(role_type=role_type)
        
        return queryset.order_by('level', 'name')
    
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['role_types'] = Role.ROLE_TYPES
        context['selected_role_type'] = self.request.GET.get('role_type', '')
        return context


class RoleDetailView(LoginRequiredMixin, DetailView):
    """Display role details."""
    model = Role
    template_name = 'accounts/role_detail.html'
    context_object_name = 'role'
    
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        role = self.get_object()
        
        # Get users with this role
        context['users'] = User.objects.filter(
            userrole__role=role,
            userrole__is_active=True
        ).select_related('profile')
        
        # Get all permissions
        context['all_permissions'] = role.get_all_permissions()
        
        return context


class RoleCreateView(LoginRequiredMixin, CreateView):
    """Create new role."""
    model = Role
    template_name = 'accounts/role_form.html'
    fields = ['name', 'code', 'description', 'role_type', 'parent_role', 'level', 'is_active', 'is_default']
    success_url = reverse_lazy('accounts:role_list')
    
    def form_valid(self, form):
        messages.success(self.request, 'Role created successfully.')
        return super().form_valid(form)


class RoleUpdateView(LoginRequiredMixin, UpdateView):
    """Update role."""
    model = Role
    template_name = 'accounts/role_form.html'
    fields = ['name', 'code', 'description', 'role_type', 'parent_role', 'level', 'is_active', 'is_default']
    
    def get_success_url(self):
        return reverse('accounts:role_detail', kwargs={'pk': self.object.pk})
    
    def form_valid(self, form):
        messages.success(self.request, 'Role updated successfully.')
        return super().form_valid(form)


# ============================================================================
# User Role Assignment Views (Class-Based)
# ============================================================================

class AssignRoleView(LoginRequiredMixin, View):
    """Assign role to user."""
    
    def get(self, request, user_id):
        user = get_object_or_404(User, id=user_id)
        
        context = {
            'user_obj': user,
            'available_roles': Role.objects.filter(is_active=True),
            'current_roles': UserRole.objects.filter(user=user, is_active=True)
        }
        
        return render(request, 'accounts/assign_role.html', context)
    
    def post(self, request, user_id):
        user = get_object_or_404(User, id=user_id)
        
        role_id = request.POST.get('role_id')
        valid_from = request.POST.get('valid_from')
        valid_until = request.POST.get('valid_until')
        notes = request.POST.get('notes', '')
        
        if role_id:
            role = get_object_or_404(Role, id=role_id)
            
            # Check if user already has this role
            existing = UserRole.objects.filter(user=user, role=role, is_active=True).first()
            if existing:
                messages.warning(request, f'User already has the role {role.name}.')
            else:
                UserRole.objects.create(
                    user=user,
                    role=role,
                    assigned_by=request.user,
                    valid_from=valid_from or timezone.now(),
                    valid_until=valid_until or None,
                    notes=notes
                )
                
                # Log activity
                log_user_activity(
                    user=request.user,
                    action='create',
                    object_type='UserRole',
                    object_repr=f'{user.email} assigned {role.name}'
                )
                
                messages.success(request, f'Role {role.name} assigned to {user.email}.')
        
        return redirect('accounts:user_detail', pk=user.id)


class RevokeRoleView(LoginRequiredMixin, View):
    """Revoke role from user."""
    
    def get(self, request, user_role_id):
        user_role = get_object_or_404(UserRole, id=user_role_id)
        return render(request, 'accounts/revoke_role.html', {'user_role': user_role})
    
    def post(self, request, user_role_id):
        user_role = get_object_or_404(UserRole, id=user_role_id)
        
        user_role.is_active = False
        user_role.save()
        
        # Log activity
        log_user_activity(
            user=request.user,
            action='delete',
            object_type='UserRole',
            object_repr=f'{user_role.user.email} revoked {user_role.role.name}'
        )
        
        messages.success(request, f'Role {user_role.role.name} revoked from {user_role.user.email}.')
        return redirect('accounts:user_detail', pk=user_role.user.id)


# ============================================================================
# Activity and Session Views (Class-Based)
# ============================================================================

class UserActivityListView(LoginRequiredMixin, ListView):
    """View to display user activities using the enhanced Activity model."""
    model = Activity
    template_name = 'accounts/activity_list.html'
    context_object_name = 'activities'
    paginate_by = 50
    
    def get_queryset(self):
        queryset = Activity.objects.select_related('user')
        
        # Filter by user
        user_id = self.request.GET.get('user')
        if user_id:
            queryset = queryset.filter(user_id=user_id)
        
        # Filter by action
        action = self.request.GET.get('action')
        if action:
            queryset = queryset.filter(action=action)
        
        # Filter by date range
        date_from = self.request.GET.get('date_from')
        date_to = self.request.GET.get('date_to')
        if date_from:
            queryset = queryset.filter(created_at__date__gte=date_from)
        if date_to:
            queryset = queryset.filter(created_at__date__lte=date_to)
        
        return queryset.order_by('-created_at')
    
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['users'] = User.objects.filter(is_active=True)
        context['actions'] = Activity.ACTION_CHOICES
        return context


class UserSessionListView(LoginRequiredMixin, ListView):
    """List user sessions."""
    model = UserSession
    template_name = 'accounts/session_list.html'
    context_object_name = 'sessions'
    paginate_by = 50
    
    def get_queryset(self):
        queryset = UserSession.objects.select_related('user')
        
        # Filter by user
        user_id = self.request.GET.get('user')
        if user_id:
            queryset = queryset.filter(user_id=user_id)
        
        # Filter by active status
        is_active = self.request.GET.get('is_active')
        if is_active == 'true':
            queryset = queryset.filter(is_active=True)
        elif is_active == 'false':
            queryset = queryset.filter(is_active=False)
        
        return queryset.order_by('-last_activity')
    
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['users'] = User.objects.filter(is_active=True)
        return context


# ============================================================================
# AJAX Views (Class-Based)
# ============================================================================

class UserSearchAjaxView(LoginRequiredMixin, View):
    """AJAX user search."""
    
    def get(self, request):
        query = request.GET.get('q', '')
        users = User.objects.filter(
            Q(email__icontains=query) |
            Q(first_name__icontains=query) |
            Q(last_name__icontains=query)
        )[:10]
        
        results = []
        for user in users:
            results.append({
                'id': user.id,
                'email': user.email,
                'name': user.get_full_name(),
                'avatar': user.profile.get_avatar_url() if hasattr(user, 'profile') else None
            })
        
        return JsonResponse({'results': results})


class CheckEmailAvailabilityView(LoginRequiredMixin, View):
    """Check if email is available."""
    
    def get(self, request):
        email = request.GET.get('email', '')
        user_id = request.GET.get('user_id')
        
        if user_id:
            exists = User.objects.filter(email=email).exclude(id=user_id).exists()
        else:
            exists = User.objects.filter(email=email).exists()
        
        return JsonResponse({'available': not exists})


class UserStatsAjaxView(LoginRequiredMixin, View):
    """Get user statistics."""
    
    def get(self, request):
        stats = {
            'total_users': User.objects.count(),
            'active_users': User.objects.filter(is_active=True).count(),
            'verified_users': User.objects.filter(is_verified=True).count(),
            'staff_users': User.objects.filter(is_staff=True).count(),
            'recent_logins': User.objects.filter(
                last_login__gte=timezone.now() - timezone.timedelta(days=7)
            ).count()
        }
        
        return JsonResponse(stats)


# ============================================================================
# Dashboard Views (Class-Based)
# ============================================================================

class DashboardView(LoginRequiredMixin, TemplateView):
    """Main dashboard view."""
    template_name = 'accounts/dashboard.html'
    
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        
        context.update({
            'user_count': User.objects.filter(is_active=True).count(),
            'department_count': Department.objects.filter(is_active=True).count(),
            'role_count': Role.objects.filter(is_active=True).count(),
            'recent_activities': Activity.objects.select_related('user').order_by('-created_at')[:10],
            'active_sessions': UserSession.objects.filter(is_active=True).count(),
            'recent_users': User.objects.filter(is_active=True).order_by('-date_joined')[:5]
        })
        
        return context


# ============================================================================
# Permission Views (Class-Based)
# ============================================================================

class PermissionListView(LoginRequiredMixin, ListView):
    """List all permissions."""
    model = Permission
    template_name = 'accounts/permission_list.html'
    context_object_name = 'permissions'
    paginate_by = 50
    
    def get_queryset(self):
        queryset = super().get_queryset()
        queryset = queryset.filter(is_active=True)
        return queryset
    
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['roles'] = Role.objects.filter(is_active=True)
        return context


class PermissionDetailView(LoginRequiredMixin, DetailView):
    """Detail view for a specific permission."""
    model = Permission
    template_name = 'accounts/permission_detail.html'
    context_object_name = 'permission'
    
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['roles'] = Role.objects.filter(is_active=True)
        return context
    
    def get_queryset(self):
        queryset = super().get_queryset()
        queryset = queryset.filter(is_active=True)
        return queryset


# ============================================================================
# Compatibility Functions (for backward compatibility)
# ============================================================================

@login_required
def profile_view(request):
    """Function-based view for backward compatibility."""
    view = ProfileView.as_view()
    return view(request)


@login_required
def profile_edit(request):
    """Function-based view for backward compatibility."""
    view = ProfileEditView.as_view()
    return view(request)


@login_required
def change_password(request):
    """Function-based view for backward compatibility."""
    view = ChangePasswordView.as_view()
    return view(request)


@login_required
def settings_view(request):
    """Function-based view for backward compatibility."""
    view = SettingsView.as_view()
    return view(request)


@login_required
def profile_update_api(request):
    """Function-based API view for backward compatibility."""
    view = ProfileUpdateAPIView.as_view()
    return view(request)


@login_required
def change_password_api(request):
    """Function-based API view for backward compatibility."""
    view = ChangePasswordAPIView.as_view()
    return view(request)


@login_required
def user_sessions_api(request):
    """Function-based API view for backward compatibility."""
    view = UserSessionsAPIView.as_view()
    return view(request)


@login_required
def user_activities_api(request):
    """Function-based API view for backward compatibility."""
    view = UserActivitiesAPIView.as_view()
    return view(request)


@login_required
def terminate_session_api(request):
    """Function-based API view for backward compatibility."""
    view = TerminateSessionAPIView.as_view()
    return view(request)


@login_required
def assign_role(request, user_id):
    """Function-based view for backward compatibility."""
    view = AssignRoleView.as_view()
    return view(request, user_id=user_id)


@login_required
def revoke_role(request, user_role_id):
    """Function-based view for backward compatibility."""
    view = RevokeRoleView.as_view()
    return view(request, user_role_id=user_role_id)


@ajax_required
@login_required
def user_search_ajax(request):
    """Function-based AJAX view for backward compatibility."""
    view = UserSearchAjaxView.as_view()
    return view(request)


@ajax_required
@login_required
def check_email_availability(request):
    """Function-based AJAX view for backward compatibility."""
    view = CheckEmailAvailabilityView.as_view()
    return view(request)


@ajax_required
@login_required
def user_stats_ajax(request):
    """Function-based AJAX view for backward compatibility."""
    view = UserStatsAjaxView.as_view()
    return view(request)


@login_required
def dashboard(request):
    """Function-based view for backward compatibility."""
    view = DashboardView.as_view()
    return view(request)


@login_required
def logout_view(request):
    """Function-based view for backward compatibility."""
    view = LogoutView.as_view()
    return view(request)
