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_tracker


FarmAlertsValidationErrorSerializer = build_envelope_serializer(
    "FarmAlertsValidationErrorSerializer",
    data_required=False,
    allow_null=True,
)
FarmAlertsTrackerResponseSerializer = build_envelope_serializer(
    "FarmAlertsTrackerResponseSerializer",
    data_schema=None,
)


class FarmAlertsTrackerView(APIView):
    @extend_schema(
        tags=["Farm Alerts"],
        summary="ارزیابی tracker هشدارهای مزرعه",
        description=(
            "با دریافت farm_uuid، هشدارهای مزرعه را تحلیل می کند، "
            "کانتکست مزرعه و لیست alertهای ورودی را به 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",
                    "alerts": [
                        {
                            "alert_id": "soil-moisture-001",
                            "level": "warning",
                            "title": "افت رطوبت خاک",
                            "message": "رطوبت خاک کمتر از حد مطلوب گزارش شده است.",
                            "suggested_action": "آبیاری اصلاحی بررسی شود.",
                            "source_metric_type": "moisture",
                        }
                    ],
                },
                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"],
                alerts=validated.get("alerts"),
            )
        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)
