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)
