from rest_framework.views import APIView
from rest_framework import status
from django.shortcuts import get_object_or_404
from users.permission.sub_admin import IsSuperAdmin
from rest_framework.response import Response
from users.serializers.country_admin_serializer import CountryAdminCreateSerializer
from users.models.users import User
from drf_yasg.utils import swagger_auto_schema
from drf_yasg import openapi

class CountryAdminView(APIView):
    permission_classes = [IsSuperAdmin]

    @swagger_auto_schema(
        request_body=CountryAdminCreateSerializer,
        responses={
            201: openapi.Response(
                description="Country admin created successfully",
                schema=openapi.Schema(
                    type=openapi.TYPE_OBJECT,
                    properties={
                        "message": openapi.Schema(type=openapi.TYPE_STRING)
                    }
                )
            ),
            400: "Bad Request"
        }
    )
    def post(self, request):
        serializer = CountryAdminCreateSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response({"message": "Country admin created"}, status=201)
        return Response(serializer.errors, status=400)

    def get(self, request):
        country_name = request.query_params.get('country', None)

        qs = User.objects.filter(role='sub_admin')
        if country_name:
            qs = qs.filter(country__name__iexact=country_name)

        data = [
            {
                "id": user.id,
                "email": user.email,
                "full_name": user.full_name,
                "country": user.country.name if user.country else None,
                "status": user.status,
                "joined": user.date_joined
            }
            for user in qs
        ]

        return Response(data)
    
    @swagger_auto_schema(
    operation_description="Update country admin name and status only",
    request_body=openapi.Schema(
        type=openapi.TYPE_OBJECT,
        properties={
            'full_name': openapi.Schema(type=openapi.TYPE_STRING),
            'status': openapi.Schema(type=openapi.TYPE_STRING),
        }
    ),
    responses={
        200: openapi.Response(description="Country admin updated successfully"),
        400: "Bad Request",
        404: "Not Found"
    }
)
    def patch(self, request, id):
        user = get_object_or_404(User, id=id, role='sub_admin')

        allowed_fields = ['full_name', 'status']
        for field in allowed_fields:
            if field in request.data:
                setattr(user, field, request.data[field])

        user.save()

        return Response(
            {
                "message": "Country admin updated successfully",
                "data": {
                    "id": user.id,
                    "full_name": user.full_name,
                    "status": user.status,
                }
            },
            status=status.HTTP_200_OK
        )
        
    @swagger_auto_schema(
    operation_description="Delete a country admin",
    responses={
        204: openapi.Response(description="Country admin deleted successfully"),
        404: "Not Found"
    }
)
    def delete(self, request, id):
        user = get_object_or_404(User, id=id, role='sub_admin')
        user.delete()
        return Response(
            {"message": "Country admin deleted successfully"},
            status=status.HTTP_404_NOT_FOUND
        )
