from django.core.exceptions import ImproperlyConfigured from django.http import Http404 from rest_framework import serializers, status from rest_framework.response import Response from rest_framework.views import APIView from drf_spectacular.types import OpenApiTypes from drf_spectacular.utils import extend_schema from config.swagger import status_response from .services import ( create_zones_and_dispatch, get_cultivation_risk_payload, get_default_area_feature, get_initial_zones_payload, get_latest_area_payload, get_products_payload, get_soil_quality_payload, get_water_need_payload, get_zone_details_payload, ) class AreaView(APIView): @extend_schema( tags=["Crop Zoning"], responses={200: status_response("CropZoningAreaResponse", data=serializers.JSONField())}, ) def get(self, request): return Response({"status": "success", "data": get_latest_area_payload()}, status=status.HTTP_200_OK) class ProductsView(APIView): @extend_schema( tags=["Crop Zoning"], responses={200: status_response("CropZoningProductsResponse", data=serializers.JSONField())}, ) def get(self, request): return Response({"status": "success", "data": get_products_payload()}, status=status.HTTP_200_OK) class ZonesInitialView(APIView): @extend_schema( tags=["Crop Zoning"], request=OpenApiTypes.OBJECT, responses={200: status_response("CropZoningZonesInitialResponse", data=serializers.JSONField())}, ) def post(self, request): area_feature = request.data.get("area") or request.data.get("area_geojson") or get_default_area_feature() try: crop_area, _zones = create_zones_and_dispatch(area_feature) except ValueError as exc: return Response({"status": "error", "message": str(exc)}, status=status.HTTP_400_BAD_REQUEST) except ImproperlyConfigured as exc: return Response({"status": "error", "message": str(exc)}, status=status.HTTP_500_INTERNAL_SERVER_ERROR) return Response({"status": "success", "data": get_initial_zones_payload(crop_area)}, status=status.HTTP_200_OK) class ZonesWaterNeedView(APIView): @extend_schema( tags=["Crop Zoning"], request=OpenApiTypes.OBJECT, responses={200: status_response("CropZoningZonesWaterNeedResponse", data=serializers.JSONField())}, ) def post(self, request): zone_ids = request.data.get("zoneIds") return Response({"status": "success", "data": get_water_need_payload(zone_ids)}, status=status.HTTP_200_OK) class ZonesSoilQualityView(APIView): @extend_schema( tags=["Crop Zoning"], request=OpenApiTypes.OBJECT, responses={200: status_response("CropZoningZonesSoilQualityResponse", data=serializers.JSONField())}, ) def post(self, request): zone_ids = request.data.get("zoneIds") return Response({"status": "success", "data": get_soil_quality_payload(zone_ids)}, status=status.HTTP_200_OK) class ZonesCultivationRiskView(APIView): @extend_schema( tags=["Crop Zoning"], request=OpenApiTypes.OBJECT, responses={200: status_response("CropZoningZonesCultivationRiskResponse", data=serializers.JSONField())}, ) def post(self, request): zone_ids = request.data.get("zoneIds") return Response({"status": "success", "data": get_cultivation_risk_payload(zone_ids)}, status=status.HTTP_200_OK) class ZoneDetailsView(APIView): @extend_schema( tags=["Crop Zoning"], responses={200: status_response("CropZoningZoneDetailsResponse", data=serializers.JSONField())}, ) def get(self, request, zone_id): try: data = get_zone_details_payload(zone_id) except Exception as exc: if exc.__class__.__name__ == "DoesNotExist": raise Http404("Zone not found") raise return Response({"status": "success", "data": data}, status=status.HTTP_200_OK)