<?php
/**
 * Inspired by the way elementor handles addons.
 *
 * @link https://github.com/elementor/elementor/
 */

namespace ActivityPub;

use function Activitypub\camel_to_snake_case;

if ( ! defined( 'ABSPATH' ) ) {
	exit; // Exit if accessed directly.
}

/**
 * ActivityPub transformers manager.
 *
 * ActivityPub transformers manager handler class is responsible for registering and
 * initializing all the supported WP-Pobject to ActivityPub transformers.
 *
 * @since version_number_transformer_management_placeholder
 */

class Transformers_Manager {
	/**
	 * Transformers.
	 *
	 * Holds the list of all the ActivityPub transformers. Default is `null`.
	 *
	 * @since 1.0.0
	 * @access private
	 *
	 * @var \ActivityPub\Transformer_Base[]
	 */
	private $transformers = array();

    /**
	 * Transformers manager constructor.
	 *
	 * Initializing ActivityPub transformers manager.
	 *
	 * @since version_number_transformer_management_placeholder
	 * @access public
	*/
	public function __construct() {
		$this->require_files();
	}

	/**
	 * Require files.
	 *
	 * Require ActivityPub transformer base class.
	 *
	 * @since version_number_transformer_management_placeholder
	 * @access private
	*/
	private function require_files() {
		require ACTIVITYPUB_PLUGIN_DIR . 'includes/base/class-transformer-base.php';
	}

	/**
	 * Register a transformer.
	 *
	 * @since version_number_transformer_management_placeholder
	 * @access public
	 *
	 * @param \ActivityPub\Transformer_Base $transformer_instance ActivityPub Transformer.
	 *
	 * @return bool True if the ActivityPub transformer was registered.
	 */
	public function register( Transformer_Base $transformer_instance) {

		if ( ! $transformer_instance instanceof Transformer_Base ) {
			_doing_it_wrong(
				__METHOD__,
				__( 'ActivityPub transformer instance must be a implementation of the \ActivityPub\Transformer_Base class.' ),
				'version_number_transformer_management_placeholder'
			);
			return false;
		}
		
		$transformer_name = $transformer_instance->name;
		if ( preg_match( '/[A-Z]+/', $transformer_name ) ) {
			_doing_it_wrong(
				__METHOD__,
				__( 'ActivityPub transformer names must not contain uppercase characters.' ),
				'version_number_transformer_management_placeholder'
			);
			return false;
		}

		$name_matcher = '/^[a-z0-9-]+\/[a-z0-9-]+$/';
		if ( ! preg_match( $name_matcher, $transformer_name ) ) {
			_doing_it_wrong(
				__METHOD__,
				__( 'ActivityPub transformer names must contain a namespace prefix. Example: my-plugin/my-custom-transformer' ),
				'version_number_transformer_management_placeholder'
			);
			return false;
		}

		if ( $this->is_registered( $transformer_name ) ) {
			_doing_it_wrong(
				__METHOD__,
				/* translators: %s: Block name. */
				sprintf( __( 'ActivityPub transformer with name "%s" is already registered.' ), $transformer_name ),
				'version_number_transformer_management_placeholder'
			);
			return false;
		}	

		/**
		 * Should the ActivityPub transformer be registered.
		 *
		 * @since version_number_transformer_management_placeholder
		 *
		 * @param bool $should_register Should the ActivityPub transformer be registered. Default is `true`.
		 * @param \ActivityPub\Transformer_Base $transformer_instance Widget instance.
		 */
		$should_register = apply_filters( 'activitypub/transformers/is_transformer_enabled', true, $transformer_instance );

		if ( ! $should_register ) {
			return false;
		}

		$this->_transformers[ $transformer_name ] = $transformer_instance;

		return true;
	}

	/**
	 * Init transformers.
	 *
	 * Initialize ActivityPub transformer manager.
	 * 
	 * Include the builtin transformers by default and add third party ones.
	 *
	 * @since version_number_transformer_management_placeholder
	 * @access private
	*/
	private function init_transformers() {
		$builtin_transformers = [
			'post'
		];

		$this->_transformers = [];

		foreach ( $builtin_transformers as $transformer_name ) {
			include ACTIVITYPUB_PLUGIN_DIR . 'includes/transformers/class-' . $transformer_name . '.php';

			$class_name = camel_to_snake_case( $transformer_name );

			$class_name = __NAMESPACE__ . '\Transformer_' . $class_name;

			$this->register( new $class_name() );
		}

		/**
		 * After the transformers are registered.
		 *
		 * Fires after the built-in Actiitypub transformers are registered.
		 *
		 * @since version_number_transformer_management_placeholder
		 *
		 * @param Transformer_Manager $this The widgets manager.
		 */
		do_action( 'activitypub/transformers/register', $this );
	}


}	

