from django.db.models import Exists, OuterRef
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.permissions import IsAuthenticated
from apps.companies.models import Company

from apps.companies.constants import CompanyType
from apps.core.serializers import (
    UserMembershipCompanySerializer,
    UserDealershipsSerializer
)
from apps.permissions.models import UserCompanyRole


class UserMembershipsView(APIView):
    permission_classes = [IsAuthenticated]
    serializer_class = UserMembershipCompanySerializer

    def get(self, request):
        companies = (
            request.user.companies
            .only("id", "name", "company_type", "is_active")
        )

        serializer = UserMembershipCompanySerializer(companies, many=True)
        return Response({
            "companies": serializer.data
        })

class UserDealershipsView(APIView):
    permission_classes = [IsAuthenticated]
    serializer_class = UserDealershipsSerializer

    def get(self, request):
        edit_user_id = request.query_params.get("edit_user_id")

        owner_subquery = Company.objects.filter(
            users__in=[edit_user_id],
            id=OuterRef("pk"),
            company_type=CompanyType.DEALERSHIP,
            is_active=True,
        )

        companies = (
            request.user.companies
            .only("id", "name", "user_roles")
            .filter(
                company_type=CompanyType.DEALERSHIP,
                is_active=True,
            )
            .annotate(owner=Exists(owner_subquery))  # 👈 annotation
        )
        # companies = (
        #     request.user.companies
        #     .only("id", "name", "user_roles")
        #     .filter(
        #         company_type=CompanyType.DEALERSHIP,
        #         is_active=True,
        #     )
        # )

        dealerships = UserDealershipsSerializer(companies, many=True,).data

        edit_user = None
        if edit_user_id:

            membership = UserCompanyRole.objects.filter(
                user_id=edit_user_id,
                company__company_type=CompanyType.DEALERSHIP,
                is_active=True,
                role__isnull=False,
            ).select_related("company", "role", "user__profile").first()

            if membership:
                image_url = None
                if membership.user.profile.image:
                    image_url = request.build_absolute_uri(
                        membership.user.profile.image.url
                    )

                edit_user = {
                    "user_id": int(edit_user_id),
                    "email" : membership.user.email,
                    "first_name" : membership.user.profile.first_name,
                    "last_name" : membership.user.profile.last_name,
                    "image": image_url,
                    "company_id": membership.company_id,
                    "role_id": membership.role_id,
                }

        return Response({
            "dealerships": dealerships,
            "edit_user": edit_user
        })
