<?php
/**
 * Autoloader PSR-4 mínimo, sin dependencia de Composer en producción.
 *
 * @package Entrepo
 */

namespace Entrepo\Core;

defined( 'ABSPATH' ) || exit;

/**
 * Autoloader PSR-4 propio del plugin (sin depender de Composer en producción).
 *
 * Mapea un prefijo de namespace (p. ej. `Entrepo\`) a un directorio base
 * (p. ej. `src/`), traduciendo `Entrepo\Foo\Bar` a `src/Foo/Bar.php`.
 */
final class Autoloader {

	/**
	 * Prefijo de namespace gestionado (con la barra final).
	 *
	 * @var string
	 */
	private string $prefix;

	/**
	 * Directorio base que mapea al prefijo (con la barra final).
	 *
	 * @var string
	 */
	private string $base_dir;

	/**
	 * Guarda el prefijo de namespace y el directorio base que este autoloader gestionará.
	 *
	 * @param string $prefix   Prefijo de namespace gestionado (con la barra final).
	 * @param string $base_dir Directorio base que mapea al prefijo.
	 */
	public function __construct( string $prefix, string $base_dir ) {
		$this->prefix   = $prefix;
		$this->base_dir = rtrim( $base_dir, '/\\' ) . DIRECTORY_SEPARATOR;
	}

	/**
	 * Registra el método load() como autoloader SPL.
	 */
	public function register(): void {
		spl_autoload_register( array( $this, 'load' ) );
	}

	/**
	 * Resuelve una clase del namespace Entrepo\ a un fichero dentro de src/.
	 *
	 * @param string $clase Nombre completamente cualificado de la clase a cargar.
	 */
	public function load( string $clase ): void {
		if ( 0 !== strncmp( $this->prefix, $clase, strlen( $this->prefix ) ) ) {
			return;
		}

		$relative = substr( $clase, strlen( $this->prefix ) );
		$base     = $this->base_dir . str_replace( '\\', DIRECTORY_SEPARATOR, $relative );

		if ( is_readable( $base . '.php' ) ) {
			require $base . '.php';
			return;
		}

		// F7 (Freemius, modelo freemium): las clases Pro viven en ficheros con
		// sufijo `__premium_only.php` para que Freemius los retire del build
		// free (.org). En el build Pro sí existen y se resuelven aquí. En el
		// free no existen — pero tampoco se referencian nunca (sus usos están
		// tras `entrepo_fs()->is__premium_only()`, que Freemius también strippea),
		// así que este fallback simplemente no encuentra nada y no pasa nada.
		$premium = $base . '__premium_only.php';
		if ( is_readable( $premium ) ) {
			require $premium;
		}
	}
}
