# Recommend Task Status API Guide

این فایل برای تیم فرانت‌اند توضیح می‌دهد که برای ماژول‌های `fertilization_recommendation` و `irrigation_recommendation` چه درخواست‌هایی باید به بک‌اند ارسال شود و چه پاسخ‌هایی باید دریافت شود.

## Fertilization Recommendation

### 1) ثبت درخواست پیشنهاد

**Endpoint**

`POST /api/fertilization-recommendation/recommend/`

**Request Body**

```json
{
  "crop_id": "wheat",
  "growth_stage": "tillering",
  "farm_data": {
    "soilType": "loam",
    "organicMatter": "medium",
    "waterEC": "1.2"
  },
  "soilType": "loam",
  "organicMatter": "medium",
  "waterEC": "1.2"
}
```

**Field Description**

- `crop_id`: شناسه محصول
- `growth_stage`: مرحله رشد محصول
- `farm_data.soilType`: نوع خاک
- `farm_data.organicMatter`: مقدار ماده آلی
- `farm_data.waterEC`: EC آب
- `soilType`, `organicMatter`, `waterEC`: همین داده‌ها اگر فرانت بخواهد به صورت flat هم ارسال کند

**Success Response**

اگر سرویس خارجی مستقیم نتیجه را برگرداند:

```json
{
  "status": "success",
  "data": {
    "plan": {
      "npkRatio": "20-20-20",
      "amountPerHectare": "150 kg/ha",
      "applicationMethod": "drip",
      "applicationInterval": "every 14 days",
      "reasoning": "balanced nutrition for current growth stage"
    }
  }
}
```

اگر سرویس خارجی async باشد، معمولاً `task_id` برمی‌گرداند:

```json
{
  "status": "success",
  "data": {
    "task_id": "fert-task-123",
    "status": "pending"
  }
}
```

### 2) دریافت وضعیت تسک

**Endpoint**

`GET /api/fertilization-recommendation/recommend/status/{task_id}/`

**Path Param**

- `task_id`: شناسه تسکی که از مرحله قبل گرفته شده

**Success Response**

```json
{
  "status": "success",
  "data": {
    "task_id": "fert-task-123",
    "status": "processing",
    "progress": {
      "message": "analyzing farm data"
    },
    "result": {
      "plan": {
        "npkRatio": "20-20-20",
        "amountPerHectare": "150 kg/ha",
        "applicationMethod": "drip",
        "applicationInterval": "every 14 days",
        "reasoning": "balanced nutrition for current growth stage"
      }
    }
  }
}
```

**Possible status values**

- `pending`
- `processing`
- `completed`
- `failed`

---

## Irrigation Recommendation

### 1) ثبت درخواست پیشنهاد

**Endpoint**

`POST /api/irrigation-recommendation/recommend/`

**Request Body**

```json
{
  "crop_id": "wheat",
  "farm_data": {
    "soilType": "loam",
    "waterQuality": "good",
    "climateZone": "semi-arid"
  },
  "soilType": "loam",
  "waterQuality": "good",
  "climateZone": "semi-arid"
}
```

**Field Description**

- `crop_id`: شناسه محصول
- `farm_data.soilType`: نوع خاک
- `farm_data.waterQuality`: کیفیت آب
- `farm_data.climateZone`: اقلیم
- `soilType`, `waterQuality`, `climateZone`: همین داده‌ها در حالت flat

**Success Response**

حالت نتیجه مستقیم:

```json
{
  "status": "success",
  "data": {
    "plan": {
      "frequencyPerWeek": "3",
      "durationMinutes": "45",
      "bestTimeOfDay": "early morning",
      "moistureLevel": "optimal",
      "warning": "avoid irrigation during strong wind"
    },
    "raw_response": "...",
    "water_balance": {
      "daily": [
        {
          "forecast_date": "2025-03-28",
          "et0_mm": 4.1,
          "etc_mm": 3.8,
          "effective_rainfall_mm": 0.0,
          "gross_irrigation_mm": 3.8,
          "irrigation_timing": "06:00"
        }
      ],
      "crop_profile": {
        "kc_initial": 0.7,
        "kc_mid": 1.05,
        "kc_end": 0.85
      },
      "active_kc": 1.05
    },
    "status": "completed"
  }
}
```

حالت async:

```json
{
  "status": "success",
  "data": {
    "task_id": "irr-task-123",
    "status": "pending"
  }
}
```

### 2) دریافت وضعیت تسک

**Endpoint**

`GET /api/irrigation-recommendation/recommend/status/{task_id}/`

**Path Param**

- `task_id`: شناسه تسک

**Success Response**

```json
{
  "status": "success",
  "data": {
    "task_id": "irr-task-123",
    "status": "completed",
    "result": {
      "plan": {
        "frequencyPerWeek": "3",
        "durationMinutes": "45",
        "bestTimeOfDay": "early morning",
        "moistureLevel": "optimal",
        "warning": "avoid irrigation during strong wind"
      },
      "raw_response": "...",
      "water_balance": {
        "daily": [],
        "crop_profile": {
          "kc_initial": 0.7,
          "kc_mid": 1.05,
          "kc_end": 0.85
        },
        "active_kc": 1.05
      },
      "status": "completed"
    }
  }
}
```

---

## پیشنهاد پیاده‌سازی در فرانت

### Fertilization

1. با `POST /recommend/` درخواست را ارسال کنید.
2. اگر `data.task_id` برگشت، polling را با `GET /recommend/status/{task_id}/` شروع کنید.
3. وقتی `data.status` به `completed` رسید، `data.result` را نمایش دهید.
4. اگر `failed` شد، پیام خطا را به کاربر نشان دهید.

### Irrigation

1. با `POST /recommend/` درخواست را ارسال کنید.
2. اگر `task_id` برگشت، هر چند ثانیه وضعیت را چک کنید.
3. وقتی `completed` شد، `result.plan` و `result.water_balance` را نمایش دهید.

## نکات

- همه پاسخ‌ها در این پروژه معمولاً با ساختار زیر برمی‌گردند:

```json
{
  "status": "success",
  "data": {}
}
```

- در صورت خطا ممکن است `status` مقدار دیگری داشته باشد یا سرویس خارجی خطای مستقیم برگرداند.
- فرانت باید هر دو حالت **direct result** و **task-based result** را هندل کند.
