<?php
/**
 * La costura free/pro: punto único de verdad de si esta instalación tiene
 * las features Pro activas, y de la matriz de reparto entre planes.
 *
 * Principios de la casa (PRODUCT.md — NO negociables, ver el plan de F4):
 * - «si un día deja de pagar sus precios siguen aplicándose»: el gating
 *   free/pro se aplica SOLO a ACTIVAR/CONFIGURAR features nuevas, JAMÁS al
 *   runtime de lo YA configurado. Una licencia caducada solo pierde updates
 *   y soporte (lo resolverá Freemius en F5, ver más abajo); una instalación
 *   que nunca fue Pro nunca llegó a activar nada que ahora deba "seguir
 *   funcionando".
 * - «free que sirve de verdad»: `MATRIZ['free']` es generosa a propósito —
 *   todo el motor de precios de F1 (grupos, precio neto por rol, y su
 *   recálculo automático del catálogo al cambiar un grupo), el registro B2B
 *   con aprobación, ocultar precios (F4-1) y el configurador de IVA español
 *   son gratis para siempre, no un anzuelo. Free NUNCA sirve un precio o
 *   régimen incorrecto en silencio — corregirlo cuando cambia un grupo es
 *   parte de esa promesa, no una comodidad Pro.
 * - Honestidad: ninguna vista Pro se oculta en silencio ni finge estar
 *   activa — el panel pinta una tarjeta clara «Función Pro» en su lugar
 *   (ver `app/components/TarjetaPro.js`).
 *
 * En F4 no existe todavía integración con Freemius (llega en F5, cuando el
 * usuario tenga cuenta y SDK): el filtro por defecto es TRUE — desarrollo y
 * testers ven todo, porque negar features Pro por defecto sin un sistema de
 * pago real solo estorbaría el propio desarrollo. Freemius enganchará este
 * MISMO filtro con `fs()->is_paying()` (o el criterio que decida F5); el día
 * que eso ocurra, esta clase y sus consumidores (REST, runtime, panel) no
 * cambian una sola línea — todos gatean sobre `es_pro()`, nunca sobre el
 * filtro directamente.
 *
 * @package Entrepo
 */

namespace Entrepo\Core;

defined( 'ABSPATH' ) || exit;

/**
 * Punto único de verdad del plan (free/pro) de esta instalación.
 */
final class Plan {

	/**
	 * Reparto EXACTO entre planes (público — se repite en `readme.txt`,
	 * sección "Free vs Pro"; ambas copias deben mantenerse sincronizadas si
	 * el reparto cambia).
	 *
	 * FREE es el motor completo de F1 + lo comercial de F4-1 + el
	 * configurador de IVA de F2-4 + el recálculo automático del catálogo al
	 * cambiar un grupo (fix ARBITRAJE, lote de revisión de rama F4: es
	 * corrección básica del propio core free, no una comodidad Pro — ver
	 * `GruposController::crear()`/`actualizar()`): una tienda mayorista puede
	 * operar de verdad sin pagar nunca. PRO es el trabajo manual que el
	 * software automatiza: overrides finos, validación VIES real y sus
	 * derivados fiscales. El recálculo PROGRAMADO o bajo demanda del
	 * catálogo completo queda anotado como concepto Pro FUTURO (aún sin
	 * construir, «(próximamente)» en la matriz) — no confundir con el
	 * recálculo automático de arriba, que ya es gratis desde F4.
	 *
	 * @var array{free:string[],pro:string[]}
	 */
	public const MATRIZ = array(
		'free' => array(
			'Grupos B2B ilimitados, cada uno con su % de descuento.',
			'Precio neto por rol servido en tienda y carrito (motor de precios F1).',
			'Registro B2B (razón social, NIF/IVA, país) con aprobación manual del admin.',
			'Ocultar precios y compra a invitados o a todo no-B2B (F4-1).',
			'Configurador de IVA español en un clic.',
			'Recálculo automático del catálogo al cambiar un grupo (crear o editar).',
		),
		'pro'  => array(
			'Overrides de precio por producto/variación (editor de Precios).',
			'Simulador "¿qué ve este cliente?".',
			'Validación VIES automática + exención intracomunitaria + recargo de equivalencia.',
			'Recálculo programado o bajo demanda del catálogo completo (próximamente).',
		),
	);

	/**
	 * `true` si esta instalación tiene las features Pro activas.
	 *
	 * Fuente ÚNICA: el filtro `entrepo_es_pro`. Nunca leer ninguna otra
	 * señal (option, meta, licencia propia) desde aquí ni desde ningún
	 * consumidor — mantener un único punto de verdad es lo que permite que
	 * Freemius se enganche en F5 sin re-arquitectura.
	 *
	 * Fix MINOR (lote de revisión de rama): este filtro no gatea solo
	 * pantallas de admin — también gobierna runtime fiscal real en checkout
	 * (`FiscalHooks::calcular_condiciones()`/`calcular_recargo()`: exención
	 * intracomunitaria y recargo de equivalencia), así que un cambio en
	 * `entrepo_es_pro` puede cambiar en el acto el IVA que se le cobra a un
	 * cliente en el carrito, no solo qué ve en el panel.
	 *
	 * @return bool
	 */
	public static function es_pro(): bool {
		/**
		 * Filtra si esta instalación tiene las features Pro activas.
		 *
		 * Default `true` en F4 (sin Freemius todavía: ver el docblock de la
		 * clase). Freemius (F5) enganchará este filtro con `fs()->is_paying()`.
		 *
		 * @param bool $es_pro Por defecto `true`.
		 */
		return (bool) apply_filters( 'entrepo_es_pro', true );
	}

	/*
	 * El `WP_Error` 403 «esto requiere Pro» YA NO VIVE AQUÍ: se movió a
	 * `PlanPro::error_rest()`, en `PlanPro__premium_only.php`, para que
	 * Freemius lo retire entero del build free que va a WordPress.org.
	 *
	 * Motivo, revisión de .org del 06/08/2026: en el build del directorio no
	 * debe quedar nada que sugiera funcionalidad bloqueada tras un pago, ni
	 * siquiera el texto del error. Esta clase se queda como lo que siempre
	 * debió ser: la matriz de reparto y un filtro, sin licencias de por medio.
	 */
}
