<?php
/**
 * Registers the experimental features to the plugin.
 *
 * @package WordPress\AI\Experiments
 */

declare( strict_types=1 );

namespace WordPress\AI\Experiments;

// Exit if accessed directly.
defined( 'ABSPATH' ) || exit;

/**
 * Registers experimental features to the plugin
 *
 * Uses wpai_default_feature_classes filter to register experiments, which are then initialized by the Loader class.
 *
 * @internal
 * @since 0.6.0
 */
final class Experiments {
	/**
	 * The list of experiment classes.
	 *
	 * @var array<class-string<\WordPress\AI\Contracts\Feature>>
	 */
	private const EXPERIMENT_CLASSES = array( // phpcs:ignore SlevomatCodingStandard.Classes.DisallowMultiConstantDefinition -- This is used as an array const.
		\WordPress\AI\Experiments\Abilities_Explorer\Abilities_Explorer::class,
		\WordPress\AI\Experiments\Connector_Approval\Connector_Approval::class,
		\WordPress\AI\Experiments\AI_Request_Logging\AI_Request_Logging::class,
		\WordPress\AI\Experiments\Content_Classification\Content_Classification::class,
		\WordPress\AI\Experiments\Content_Resizing\Content_Resizing::class,
		\WordPress\AI\Experiments\Excerpt_Generation\Excerpt_Generation::class,
		\WordPress\AI\Experiments\Alt_Text_Generation\Alt_Text_Generation::class,
		\WordPress\AI\Experiments\Meta_Description\Meta_Description::class,
		\WordPress\AI\Experiments\Editorial_Notes\Editorial_Notes::class,
		\WordPress\AI\Experiments\Editorial_Updates\Editorial_Updates::class,
		\WordPress\AI\Experiments\Summarization\Summarization::class,
		\WordPress\AI\Experiments\Title_Generation\Title_Generation::class,
		\WordPress\AI\Experiments\Type_Ahead\Type_Ahead::class,
		\WordPress\AI\Experiments\Comment_Moderation\Comment_Moderation::class,
		\WordPress\AI\Experiments\Key_Encryption\Key_Encryption::class,
		\WordPress\AI\Experiments\Suggest_Reply\Suggest_Reply::class,
	);

	/**
	 * Initializes the experiments by hooking into the appropriate filter.
	 *
	 * @since 0.6.0
	 */
	public function init(): void {
		// Priority 9 ensures it runs before any potential overrides at default priority.
		add_filter( 'wpai_default_feature_classes', array( self::class, 'register_default_experiment_classes' ), 9 );
	}

	/**
	 * Registers default experiment classes.
	 *
	 * @since 0.6.0
	 *
	 * @param array<string, class-string<\WordPress\AI\Contracts\Feature>> $existing Array of existing experiment class names, with experiment IDs as keys.
	 *
	 * @return array<string, class-string<\WordPress\AI\Contracts\Feature>> Array of experiment class names, with experiment IDs as keys.
	 */
	public static function register_default_experiment_classes( array $existing ): array {
		$experiments = array();
		foreach ( self::EXPERIMENT_CLASSES as $class_name ) {
			$experiments[ $class_name::get_id() ] = $class_name;
		}

		return array_merge( $existing, $experiments );
	}
}
