from drf_spectacular.utils import OpenApiExample, extend_schema from rest_framework import status from rest_framework.response import Response from rest_framework.views import APIView from config.openapi import build_envelope_serializer, build_response from .serializers import FarmAlertsRequestSerializer from .services import get_farm_alerts_timeline, get_farm_alerts_tracker FarmAlertsValidationErrorSerializer = build_envelope_serializer( "FarmAlertsValidationErrorSerializer", data_required=False, allow_null=True, ) FarmAlertsTrackerResponseSerializer = build_envelope_serializer( "FarmAlertsTrackerResponseSerializer", data_schema=None, ) FarmAlertsTimelineResponseSerializer = build_envelope_serializer( "FarmAlertsTimelineResponseSerializer", data_schema=None, ) class FarmAlertsTrackerView(APIView): @extend_schema( tags=["Farm Alerts"], summary="ارزیابی tracker هشدارهای مزرعه", description=( "با دریافت farm_uuid، هشدارهای مزرعه را تحلیل می کند، " "کانتکست مزرعه را به RAG می فرستد، و notificationهای سطح خطر/هشدار/اطلاع رسانی را در دیتابیس ذخیره می کند." ), request=FarmAlertsRequestSerializer, responses={ 200: build_response(FarmAlertsTrackerResponseSerializer, "خروجی tracker هشدارهای مزرعه."), 400: build_response(FarmAlertsValidationErrorSerializer, "پارامتر ورودی نامعتبر است."), 500: build_response(FarmAlertsValidationErrorSerializer, "خطا در تولید خروجی tracker هشدارها."), }, examples=[ OpenApiExample( "نمونه درخواست tracker", value={ "farm_uuid": "11111111-1111-1111-1111-111111111111", }, request_only=True, ), ], ) def post(self, request): serializer = FarmAlertsRequestSerializer(data=request.data) if not serializer.is_valid(): return Response( {"code": 400, "msg": "داده نامعتبر.", "data": serializer.errors}, status=status.HTTP_400_BAD_REQUEST, ) validated = serializer.validated_data try: result = get_farm_alerts_tracker( farm_uuid=validated["farm_uuid"], query=validated.get("query"), ) except Exception as exc: return Response( {"code": 500, "msg": f"خطا در تولید tracker هشدارها: {exc}", "data": None}, status=status.HTTP_500_INTERNAL_SERVER_ERROR, ) return Response({"code": 200, "msg": "success", "data": result}, status=status.HTTP_200_OK) class FarmAlertsTimelineView(APIView): @extend_schema( tags=["Farm Alerts"], summary="دریافت timeline هشدارهای مزرعه", description=( "با دریافت farm_uuid، timeline هشدارهای مزرعه را با کمک RAG می سازد " "و notificationهای استخراج شده را در دیتابیس ذخیره می کند." ), request=FarmAlertsRequestSerializer, responses={ 200: build_response(FarmAlertsTimelineResponseSerializer, "خروجی timeline هشدارهای مزرعه."), 400: build_response(FarmAlertsValidationErrorSerializer, "پارامتر ورودی نامعتبر است."), 500: build_response(FarmAlertsValidationErrorSerializer, "خطا در تولید timeline هشدارها."), }, examples=[ OpenApiExample( "نمونه درخواست timeline", value={ "farm_uuid": "11111111-1111-1111-1111-111111111111", }, request_only=True, ), ], ) def post(self, request): serializer = FarmAlertsRequestSerializer(data=request.data) if not serializer.is_valid(): return Response( {"code": 400, "msg": "داده نامعتبر.", "data": serializer.errors}, status=status.HTTP_400_BAD_REQUEST, ) validated = serializer.validated_data try: result = get_farm_alerts_timeline( farm_uuid=validated["farm_uuid"], query=validated.get("query"), ) except Exception as exc: return Response( {"code": 500, "msg": f"خطا در تولید timeline هشدارها: {exc}", "data": None}, status=status.HTTP_500_INTERNAL_SERVER_ERROR, ) return Response({"code": 200, "msg": "success", "data": result}, status=status.HTTP_200_OK)