from rest_framework import serializers from .models import IrrigationMethod class IrrigationMethodSerializer(serializers.ModelSerializer): """سریالایزر خروجی / ورودی برای IrrigationMethod.""" class Meta: model = IrrigationMethod fields = [ "id", "name", "category", "description", "water_efficiency_percent", "water_pressure_required", "flow_rate", "coverage_area", "soil_type", "climate_suitability", "created_at", "updated_at", ] read_only_fields = ["id", "created_at", "updated_at"] class IrrigationRecommendRequestSerializer(serializers.Serializer): """سریالایزر ورودی برای درخواست توصیه آبیاری.""" farm_uuid = serializers.CharField(required=False, help_text="شناسه یکتای مزرعه (اجباری)") sensor_uuid = serializers.CharField(required=False, help_text="نام قدیمی برای farm_uuid") plant_name = serializers.CharField(required=False, allow_blank=True, help_text="نام گیاه") growth_stage = serializers.CharField(required=False, allow_blank=True, help_text="مرحله رشد گیاه") irrigation_method_name = serializers.CharField( required=False, allow_blank=True, help_text="نام روش آبیاری" ) query = serializers.CharField(required=False, allow_blank=True, help_text="سوال اختیاری") def validate(self, attrs): farm_uuid = attrs.get("farm_uuid") or attrs.get("sensor_uuid") if not farm_uuid: raise serializers.ValidationError({"farm_uuid": "farm_uuid الزامی است."}) attrs["farm_uuid"] = farm_uuid return attrs class IrrigationPlanSerializer(serializers.Serializer): """سریالایزر خروجی برای پلن توصیه آبیاری.""" frequencyPerWeek = serializers.IntegerField(help_text="تعداد دفعات آبیاری در هفته") durationMinutes = serializers.IntegerField(help_text="مدت هر بار آبیاری به دقیقه") bestTimeOfDay = serializers.CharField(help_text="بهترین زمان آبیاری") moistureLevel = serializers.IntegerField(help_text="سطح رطوبت مطلوب خاک به درصد") warning = serializers.CharField(help_text="هشدار یا توصیه مهم", allow_blank=True) class IrrigationRecommendResponseSerializer(serializers.Serializer): """سریالایزر خروجی برای ریسپانس توصیه آبیاری.""" code = serializers.IntegerField() msg = serializers.CharField() data = serializers.DictField(child=serializers.JSONField()) class WaterStressRequestSerializer(serializers.Serializer): farm_uuid = serializers.CharField(required=False, help_text="شناسه یکتای مزرعه") sensor_uuid = serializers.CharField(required=False, help_text="نام قدیمی برای farm_uuid") plant_name = serializers.CharField(required=False, allow_blank=True, help_text="نام گیاه") irrigation_recommendation = serializers.JSONField(required=False) fertilization_recommendation = serializers.JSONField(required=False) def validate(self, attrs): farm_uuid = attrs.get("farm_uuid") or attrs.get("sensor_uuid") if not farm_uuid: raise serializers.ValidationError({"farm_uuid": "farm_uuid الزامی است."}) attrs["farm_uuid"] = farm_uuid return attrs class WaterStressResponseSerializer(serializers.Serializer): farm_uuid = serializers.CharField() waterStressIndex = serializers.IntegerField() level = serializers.CharField() sourceMetric = serializers.JSONField() class IrrigationPlanParserRequestSerializer(serializers.Serializer): message = serializers.CharField(required=False, allow_blank=True, help_text="توضیح آزاد کاربر درباره برنامه آبیاری") answers = serializers.JSONField(required=False, help_text="پاسخ های تکمیلی کاربر به سوالات مرحله قبل") partial_plan = serializers.JSONField(required=False, help_text="داده استخراج شده مرحله قبل برای ادامه تکمیل") farm_uuid = serializers.CharField(required=False, allow_blank=True, help_text="شناسه مزرعه برای غنی سازی context") def validate(self, attrs): message = (attrs.get("message") or "").strip() answers = attrs.get("answers") partial_plan = attrs.get("partial_plan") if not message and not isinstance(answers, dict) and not isinstance(partial_plan, dict): raise serializers.ValidationError( "حداقل یکی از message، answers یا partial_plan باید ارسال شود." ) return attrs class PlanClarificationQuestionSerializer(serializers.Serializer): id = serializers.CharField() field = serializers.CharField() question = serializers.CharField() rationale = serializers.CharField(required=False, allow_blank=True) class IrrigationPlanParserResponseSerializer(serializers.Serializer): status = serializers.CharField() status_fa = serializers.CharField() summary = serializers.CharField() missing_fields = serializers.ListField(child=serializers.CharField()) questions = PlanClarificationQuestionSerializer(many=True) collected_data = serializers.JSONField() final_plan = serializers.JSONField(required=False, allow_null=True)