from __future__ import annotations

from typing import Any

from .growth_simulation import (
    CurrentFarmChartSimulator,
    GrowthSimulationError,
    _fa_engine_name,
    _fa_model_name,
)


def build_yield_prediction_payload(
    *,
    farm_uuid: str,
    plant_name: str | None = None,
    irrigation_recommendation: dict[str, Any] | None = None,
    fertilization_recommendation: dict[str, Any] | None = None,
) -> dict[str, Any]:
    simulator = CurrentFarmChartSimulator()
    result = simulator.simulate(
        farm_uuid=farm_uuid,
        plant_name=plant_name,
        irrigation_recommendation=irrigation_recommendation,
        fertilization_recommendation=fertilization_recommendation,
    )
    yield_estimate = float((result.get("metrics") or {}).get("yield_estimate") or 0.0)
    predicted_yield_tons = round(max(yield_estimate / 1000.0, 0.0), 2)
    return {
        "farm_uuid": farm_uuid,
        "plant_name": result.get("plant_name"),
        "predictedYieldTons": predicted_yield_tons,
        "predictedYieldRaw": round(yield_estimate, 2),
        "unit": "تن",
        "sourceUnit": "کیلوگرم در هکتار",
        "simulationEngine": _fa_engine_name(result.get("engine")),
        "simulationModel": _fa_model_name(result.get("model_name")),
        "scenarioId": result.get("scenario_id"),
        "simulationWarning": result.get("simulation_warning"),
        "supportingMetrics": result.get("metrics") or {},
    }


class YieldPredictionService:
    def get_yield_prediction(
        self,
        *,
        farm_uuid: str,
        plant_name: str | None = None,
        irrigation_recommendation: dict[str, Any] | None = None,
        fertilization_recommendation: dict[str, Any] | None = None,
    ) -> dict[str, Any]:
        try:
            return build_yield_prediction_payload(
                farm_uuid=farm_uuid,
                plant_name=plant_name,
                irrigation_recommendation=irrigation_recommendation,
                fertilization_recommendation=fertilization_recommendation,
            )
        except GrowthSimulationError:
            raise
