/** * Fertilization Recommendation API * @see RECOMMENDATION_APIS.md */ import { apiClient } from "../client"; const PREFIX = "/api/fertilization-recommendation"; const RECOMMEND_PREFIX = "/api/fertilization"; export interface FarmData { soilType: string; organicMatter: string; waterEC: string; } export interface GrowthStage { id: string; icon: string; label?: string; } export interface CropOption { id: string; labelKey?: string; name?: string; icon: string; growthStages?: string[]; } export interface FertilizationConfigResponse { farm_uuid?: string; farmData: FarmData; growthStages: GrowthStage[]; cropOptions: CropOption[]; } export interface FertilizationNpkRatio { n: number; p: number; k: number; label: string; } export interface FertilizationApplicationMethod { id: string; label: string; } export interface FertilizationApplicationInterval { label: string; unit: string; value: number; } export interface FertilizationDosage { label: string; unit: string; calculation_basis: string; base_amount_per_hectare: number; base_amount_per_square_meter: number; } export interface FertilizationPrimaryRecommendation { fertilizer_code: string; fertilizer_name: string; display_title: string; fertilizer_type: string; reasoning: string; summary: string; npk_ratio: FertilizationNpkRatio; application_method: FertilizationApplicationMethod; application_interval: FertilizationApplicationInterval; dosage: FertilizationDosage; } export interface FertilizationNutrientItem { key: string; name: string; unit: string; description: string; value: number; } export interface FertilizationApplicationStep { step_number: number; title: string; description: string; } export interface FertilizationApplicationGuide { safety_warning: string; steps: FertilizationApplicationStep[]; } export interface FertilizationAlternativeRecommendation { fertilizer_code: string; fertilizer_name: string; fertilizer_type: string; usage_method: string; description: string; } export interface FertilizationSection { title: string; icon: string; type: string; content?: string; items?: string[]; applicationMethod?: string; fertilizerType?: string; validityPeriod?: string; amount?: string; expandableExplanation?: string; timing?: string; } export interface FertilizationRecommendationResult { primary_recommendation: FertilizationPrimaryRecommendation; nutrient_analysis: { macro: FertilizationNutrientItem[]; micro: FertilizationNutrientItem[]; }; application_guide: FertilizationApplicationGuide; alternative_recommendations: FertilizationAlternativeRecommendation[]; sections: FertilizationSection[]; } export interface FertilizationRecommendPayload { farm_uuid: string; crop_id?: string; growth_stage?: string; farm_data?: Partial; soilType?: string; organicMatter?: string; waterEC?: string; } interface ApiResponse { code: number; msg: string; data: T; } async function unwrap(promise: Promise>): Promise { const res = await promise; return res.data; } export const fertilizationRecommendationService = { getConfig(farmUuid: string): Promise { return unwrap( apiClient.get>( `${PREFIX}/config/?farm_uuid=${encodeURIComponent(farmUuid)}`, ), ); }, recommend( payload?: FertilizationRecommendPayload, ): Promise { return unwrap( apiClient.post>( `${RECOMMEND_PREFIX}/recommend/`, payload ?? {}, ), ); }, };