from rest_framework.response import Response
from django.contrib.auth import get_user_model
from rest_framework import generics, status
from apps.permissions.permissions import AllowAny, CompanyPermission

from apps.permissions.models import UserCompanyRole
from apps.companies.models import Company
from apps.core.serializers.companyuserlist import CompanyUserSerializer
from rest_framework import generics
from django.db.models import Prefetch

from utils.paginations.pagination import LimitOffsetPagination


User = get_user_model()


class AllCompaniesUsersView(generics.ListAPIView):
    """List all users from all companies (superuser only)"""
    serializer_class = CompanyUserSerializer
    permission_classes = [CompanyPermission]
    pagination_class = LimitOffsetPagination # not applied since we override list method

    def get_permissions(self):
        return [CompanyPermission('view_users')]

    def list(self, request, *args, **kwargs):
        """Handle the response for all companies users"""
        if not request.user.is_superuser:
            return Response(
                {'error': 'Only superusers can access this endpoint'},
                status=status.HTTP_403_FORBIDDEN
            )

        company_ids = request.GET.get("company_ids")
        if company_ids:
            company_ids = [int(c) for c in company_ids.split(",")]
            companies = Company.objects.filter(id__in=company_ids, is_active=True)
        else:
            companies = Company.objects.filter(is_active=True)

        result = []
        for company in companies:
            role_prefetch = Prefetch(
                'company_roles',
                queryset=UserCompanyRole.objects
                .select_related('role', 'company')
                .filter(is_active=True),
                to_attr='_cached_roles'
            )

            users = company.users.select_related('profile').prefetch_related(role_prefetch).all()

            serializer = self.get_serializer(users, many=True,context={'company': company})

            result.append({
                'company': {
                    'id': company.id,
                    'name': company.name
                },
                'users': serializer.data,
                'total_users': users.count()
            })

        return Response({
            'companies': result,
            'total_companies': len(result),
            'total_users': sum(company['total_users'] for company in result)
        })
