<?php
/**
 * Registro de módulos que participan en trazabilidad (auditoría, papelera, versiones).
 *
 * @package Logistica
 */

if ( ! defined( 'ABSPATH' ) ) {
	exit;
}

/**
 * Catálogo central de módulos del plugin.
 */
class Logistica_Module_Registry {

	/**
	 * @var array<string, array<string, mixed>>
	 */
	private static $modules = array();

	/**
	 * @param string               $module_key Clave estable del módulo.
	 * @param array<string, mixed> $config     label, entity_types, features.
	 * @return void
	 */
	public static function register( $module_key, $config ) {
		$module_key = sanitize_key( (string) $module_key );
		if ( '' === $module_key ) {
			return;
		}

		$defaults = array(
			'label'         => $module_key,
			'entity_types'  => array(),
			'features'      => array( 'audit', 'trash', 'versions' ),
		);

		self::$modules[ $module_key ] = array_merge( $defaults, is_array( $config ) ? $config : array() );
	}

	/**
	 * @param string $module_key Clave del módulo.
	 * @return array<string, mixed>|null
	 */
	public static function get( $module_key ) {
		$module_key = sanitize_key( (string) $module_key );
		return self::$modules[ $module_key ] ?? null;
	}

	/**
	 * @return array<string, array<string, mixed>>
	 */
	public static function all() {
		return self::$modules;
	}

	/**
	 * @param string $module_key  Clave del módulo.
	 * @param string $feature     audit|trash|versions.
	 * @return bool
	 */
	public static function supports( $module_key, $feature ) {
		$module = self::get( $module_key );
		if ( ! $module ) {
			return false;
		}

		$features = $module['features'] ?? array();
		return in_array( $feature, $features, true );
	}

	/**
	 * @param string $module_key  Clave del módulo.
	 * @param string $entity_type Tipo de entidad.
	 * @return string
	 */
	public static function entity_label( $module_key, $entity_type ) {
		$module = self::get( $module_key );
		if ( ! $module ) {
			return (string) $entity_type;
		}

		$types = $module['entity_types'] ?? array();
		if ( isset( $types[ $entity_type ]['label'] ) ) {
			return (string) $types[ $entity_type ]['label'];
		}

		return (string) $entity_type;
	}

	/**
	 * @param string $module_key Clave del módulo.
	 * @return string
	 */
	public static function module_label( $module_key ) {
		$module = self::get( $module_key );
		return $module ? (string) ( $module['label'] ?? $module_key ) : (string) $module_key;
	}

	/**
	 * Registra los módulos conocidos del plugin (opt-in por llamadas a Entity_Lifecycle).
	 *
	 * @return void
	 */
	public static function register_defaults() {
		self::register(
			'pedidos_board',
			array(
				'label'        => __( 'Cuadro de pedidos', 'logistica' ),
				'entity_types' => array(
					'board'              => array( 'label' => __( 'Estilo de pedido', 'logistica' ) ),
					'orden'              => array( 'label' => __( 'Orden de compra', 'logistica' ) ),
					'orden_linea'        => array( 'label' => __( 'Línea de OC', 'logistica' ) ),
					'inventario'         => array( 'label' => __( 'Inventario físico', 'logistica' ) ),
					'entrega'            => array( 'label' => __( 'Entrega inventario', 'logistica' ) ),
					'orden_linea_entrega'=> array( 'label' => __( 'Entrega parcial OC', 'logistica' ) ),
				),
			)
		);

		self::register(
			'warehouse',
			array(
				'label'        => __( 'Inventario bodega', 'logistica' ),
				'entity_types' => array(
					'item' => array( 'label' => __( 'Ítem de bodega', 'logistica' ) ),
				),
			)
		);

		self::register(
			'minutas',
			array(
				'label'        => __( 'Minutas', 'logistica' ),
				'entity_types' => array(
					'minuta'       => array( 'label' => __( 'Minuta', 'logistica' ) ),
					'bulk_import'  => array( 'label' => __( 'Importación masiva', 'logistica' ) ),
				),
			)
		);

		self::register(
			'etiqueta_catalog',
			array(
				'label'        => __( 'Catálogo de etiquetas', 'logistica' ),
				'entity_types' => array(
					'producto' => array( 'label' => __( 'Producto etiqueta', 'logistica' ) ),
					'opcion'   => array( 'label' => __( 'Opción de catálogo', 'logistica' ) ),
				),
			)
		);

		self::register(
			'cierre_ordenes',
			array(
				'label'        => __( 'Cierre de órdenes', 'logistica' ),
				'entity_types' => array(
					'config'         => array( 'label' => __( 'Configuración cierre', 'logistica' ) ),
					'caracteristica' => array( 'label' => __( 'Característica', 'logistica' ) ),
				),
			)
		);

		self::register(
			'rotulo_rollos',
			array(
				'label'        => __( 'Rótulos rollos', 'logistica' ),
				'entity_types' => array(
					'rotulo' => array( 'label' => __( 'Rótulo rollo', 'logistica' ) ),
				),
			)
		);

		self::register(
			'planeacion_impresion',
			array(
				'label'        => __( 'Planeación impresión', 'logistica' ),
				'entity_types' => array(
					'plan'    => array( 'label' => __( 'Plan de impresión', 'logistica' ) ),
					'machine' => array( 'label' => __( 'Máquina impresión', 'logistica' ) ),
				),
			)
		);

		self::register(
			'planeacion_formado',
			array(
				'label'        => __( 'Planeación formado', 'logistica' ),
				'entity_types' => array(
					'plan'    => array( 'label' => __( 'Plan de formado', 'logistica' ) ),
					'machine' => array( 'label' => __( 'Máquina formado', 'logistica' ) ),
				),
			)
		);

		self::register(
			'configuracion',
			array(
				'label'        => __( 'Configuración', 'logistica' ),
				'entity_types' => array(
					'conversion_template' => array( 'label' => __( 'Plantilla conversión', 'logistica' ) ),
				),
				'features'     => array( 'audit', 'trash', 'versions' ),
			)
		);

		self::register(
			'conversion_tables',
			array(
				'label'        => __( 'Cálculos / conversiones', 'logistica' ),
				'entity_types' => array(
					'state'     => array( 'label' => __( 'Estado de tablas', 'logistica' ) ),
					'sheet_row' => array( 'label' => __( 'Fila de cálculo', 'logistica' ) ),
				),
				'features'     => array( 'audit', 'trash', 'versions' ),
			)
		);

		self::register(
			'jb_users',
			array(
				'label'        => __( 'Usuarios JB', 'logistica' ),
				'entity_types' => array(
					'user' => array( 'label' => __( 'Usuario', 'logistica' ) ),
				),
				'features'     => array( 'audit', 'trash' ),
			)
		);
	}
}
