from rest_framework import status
from rest_framework.views import APIView
from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response
from drf_spectacular.utils import extend_schema, OpenApiResponse, OpenApiExample

from api.account.serializers.objects_serializers import ObjectSerializer
from sitemanagement.models import Object

from api.utils.decorators import handle_exceptions

@extend_schema(tags=['Объекты'])
class ObjectView(APIView):
    permission_classes = [IsAuthenticated]
    serializer_class = ObjectSerializer
    
    @extend_schema(
        summary="Получение всех объектов",
        description="Получение всех объектов",
        responses={200: OpenApiResponse(response=ObjectSerializer, description="Объекты успешно получены", 
                                        examples=[OpenApiExample(
                                            'Успешный ответ',
                                            value={
                                                "id": 1,
                                                "title": "Объект 1",
                                                "description": "Описание объекта 1",
                                                "image": "https://aerbim.org/media/image.jpg",
                                                "address": "Адрес объекта 1",
                                                "floors": 1,
                                                "area": 100.0,
                                                "zones": [
                                                    {
                                                        "id": 1,
                                                        "name": "Зона 1",
                                                        "sensors": [
                                                            {
                                                                "id": 1,
                                                                "name": "Датчик 1",
                                                                "serial_number": "GA-123",
                                                                "sensor_type": "Тип датчика 1"
                                                            }
                                                        ]
                                                    }
                                                ]
                                            }
                                            
                                        )])})
    @handle_exceptions
    def get(self, request):
        """Получение всех объектов с их зонами и датчиками"""
        try:
          
            objects = Object.objects.prefetch_related(
                'zones',
                'zones__sensors',
                'zones__sensors__sensor_type'
            ).all()
            
            serializer = ObjectSerializer(objects, many=True)
            return Response(serializer.data, status=status.HTTP_200_OK)
        except Object.DoesNotExist:
            return Response(
                {"error": "Объекты не найдены"}, 
                status=status.HTTP_404_NOT_FOUND)
