// SPDX-License-Identifier: GPL-3.0-or-later // Copyright (C) 2025 - 2026, Patrick Schurig / ETM PowerSync #pragma once #include "../types/surpluscontext.h" #include "../types/plan.h" /*! * \brief Interface pure du planificateur d'énergie. * * Les implémentations concrètes héritent de QObject + IScheduler. * * \invariant getPlan() retourne IMMÉDIATEMENT (modèle cache, AGENTS invariant 5). * SocketScheduler retourne son dernier plan en cache et recalcule en arrière-plan. * \invariant getPlan() retourne TOUJOURS un Plan valide (isValid() == true). * SocketScheduler embarque un RuleBasedScheduler en fallback — jamais d'abstain * qui remonterait à l'arbitre (AGENTS règle 6). * \invariant Toute LoadAction du Plan retourné a \c reason non vide, en français. */ class IScheduler { public: virtual ~IScheduler() = default; /*! * \brief Calcule le plan d'optimisation à partir du contexte courant. * \param ctx Contexte surplus (site, compteur, PV, batterie, charges, tarif). * \return Plan avec au moins un Slot — jamais Plan::isValid() == false. * \note Retourne immédiatement depuis le cache ; le recalcul est asynchrone. */ virtual Plan getPlan(const SurplusContext &ctx) = 0; };