<?php
/**
 * @package Hafenstudios\Wellenbrecher
 */

namespace Hafenstudios\Wellenbrecher\Engine;

defined( 'ABSPATH' ) || exit;

/**
 * Eine Bewertungsregel. Regeln sind zustandsarm, einzeln schalt- und
 * gewichtbar (Settings rules.{id}.enabled / rules.{id}.points, angewandt
 * durch die RuleRegistry) und werden von der Engine nach Stufe sortiert
 * ausgefuehrt. Dritt-Regeln koennen sich ueber den Filter
 * `hafenstudios/wellenbrecher_rules` registrieren.
 */
interface RuleInterface {

	/**
	 * Eindeutige Regel-ID (Settings-Schluessel und Breakdown-Key).
	 *
	 * @return string
	 */
	public function id(): string;

	/**
	 * Kostenstufe: 0 = Gates/Trust, 1 = billig, 2 = Inhalt, 3 = teuer
	 * (Stufe 3 laeuft nur im Graubereich, siehe ScoreEngine).
	 *
	 * @return int
	 */
	public function stage(): int;

	/**
	 * Ist die Regel fuer diesen Kontext anwendbar (z.B. Kanal-Einschraenkung)?
	 *
	 * @param Context $context Bewertungs-Kontext.
	 * @return bool
	 */
	public function applies( Context $context ): bool;

	/**
	 * Bewertet den Kontext.
	 *
	 * @param Context $context Bewertungs-Kontext.
	 * @return RuleResult Punkte + Begruendungs-Key (0 Punkte = kein Treffer).
	 */
	public function evaluate( Context $context ): RuleResult;
}
