<?php

/**
 * Menu de administracion "Entrepo" (Grupos/Precios/Simulador/Clientes) y
 * encolado del bundle React del panel.
 *
 * @package Entrepo\Admin
 */
namespace Entrepo\Admin;

use Entrepo\Core\Plan;
defined( 'ABSPATH' ) || exit;
/**
 * Menú de administración del panel Entrepo y encolado del bundle React.
 *
 * Cada página del menú imprime solo el div de montaje `#entrepo-app` con su
 * `data-view`; React (app/index.js) decide qué vista renderizar. El bundle y
 * la config (`window.entrepoPanel`) solo se encolan en las páginas propias.
 */
final class AdminMenu {
    /**
     * Hooks de las páginas que montan la app React (para encolar assets solo ahí).
     *
     * @var string[]
     */
    private array $hooks = array();

    /** Engancha el menú y el encolado de assets a los hooks de admin. */
    public function register() : void {
        add_action( 'admin_menu', array($this, 'menu') );
        add_action( 'admin_enqueue_scripts', array($this, 'assets') );
    }

    /** Crea el menú "Entrepo" y sus submenús (Grupos/Precios/Simulador/Clientes). */
    public function menu() : void {
        $cap = 'manage_woocommerce';
        add_menu_page(
            __( 'Entrepo', 'entrepo' ),
            __( 'Entrepo', 'entrepo' ),
            $cap,
            'entrepo',
            array($this, 'render_dashboard'),
            'dashicons-tag',
            56
        );
        $this->hooks[] = (string) add_submenu_page(
            'entrepo',
            __( 'Entrepo — Dashboard', 'entrepo' ),
            __( 'Dashboard', 'entrepo' ),
            $cap,
            'entrepo',
            array($this, 'render_dashboard')
        );
        $this->hooks[] = (string) add_submenu_page(
            'entrepo',
            __( 'Entrepo — Groups', 'entrepo' ),
            __( 'Groups', 'entrepo' ),
            $cap,
            'entrepo-grupos',
            array($this, 'render_grupos')
        );
        $this->hooks[] = (string) add_submenu_page(
            'entrepo',
            __( 'Entrepo — Customers', 'entrepo' ),
            __( 'Customers', 'entrepo' ),
            $cap,
            'entrepo-clientes',
            array($this, 'render_clientes')
        );
        $this->hooks[] = (string) add_submenu_page(
            'entrepo',
            __( 'Entrepo — Settings', 'entrepo' ),
            __( 'Settings', 'entrepo' ),
            $cap,
            'entrepo-ajustes',
            array($this, 'render_ajustes')
        );
    }

    /** Punto de montaje de la vista Dashboard (portada del panel). */
    public function render_dashboard() : void {
        echo '<div id="entrepo-app" data-view="dashboard"></div>';
    }

    /** Punto de montaje de la vista Grupos. */
    public function render_grupos() : void {
        echo '<div id="entrepo-app" data-view="grupos"></div>';
    }

    /** Punto de montaje de la vista Precios. */
    public function render_precios() : void {
        echo '<div id="entrepo-app" data-view="precios"></div>';
    }

    /** Punto de montaje de la vista Simulador. */
    public function render_simulador() : void {
        echo '<div id="entrepo-app" data-view="simulador"></div>';
    }

    /** Punto de montaje de la vista Clientes. */
    public function render_clientes() : void {
        echo '<div id="entrepo-app" data-view="clientes"></div>';
    }

    /** Punto de montaje de la vista Ajustes. */
    public function render_ajustes() : void {
        echo '<div id="entrepo-app" data-view="ajustes"></div>';
    }

    /**
     * Encola el bundle React + estilos e inyecta `window.entrepoPanel`.
     *
     * Solo actúa en las páginas del panel. Si el bundle no está compilado
     * (falta `build/index.asset.php`), no encola nada: página vacía, sin fatal.
     *
     * @param string $hook Hook de la pantalla admin actual (lo pasa WP).
     */
    public function assets( string $hook ) : void {
        if ( !in_array( $hook, $this->hooks, true ) ) {
            return;
        }
        $asset_file = ENTREPO_PATH . 'build/index.asset.php';
        if ( !is_readable( $asset_file ) ) {
            return;
            // Bundle sin compilar: pagina vacia pero sin fatal.
        }
        $asset = (require $asset_file);
        self::encolar_estilo();
        wp_enqueue_script(
            'entrepo-app',
            ENTREPO_URL . 'build/index.js',
            $asset['dependencies'],
            (string) $asset['version'],
            true
        );
        // Traducciones del bundle React: WP busca languages/entrepo-{locale}-{md5('build/index.js')}.json
        // (generado por bin/generar-json-i18n.php a partir del .po). Ver esa clase para el md5 exacto.
        wp_set_script_translations( 'entrepo-app', 'entrepo', ENTREPO_PATH . 'languages' );
        wp_add_inline_script( 'entrepo-app', 'window.entrepoPanel = ' . wp_json_encode( array(
            'restRoot' => esc_url_raw( rest_url() ),
            'nonce'    => wp_create_nonce( 'wp_rest' ),
            'esPro'    => self::es_pro_panel(),
            'moneda'   => array(
                'symbol'       => html_entity_decode( get_woocommerce_currency_symbol() ),
                'decimals'     => wc_get_price_decimals(),
                'decimal_sep'  => wc_get_price_decimal_separator(),
                'thousand_sep' => wc_get_price_thousand_separator(),
            ),
        ) ) . ';', 'before' );
    }

    /**
     * Encola la hoja de estilos compartida del panel (tokens + componentes).
     *
     * La usan las vistas React; una sola fuente de verdad para los tokens
     * evita que el panel se separe visualmente de si mismo.
     */
    public static function encolar_estilo() : void {
        $asset_file = ENTREPO_PATH . 'build/index.asset.php';
        $css = ENTREPO_PATH . 'build/style-index.css';
        if ( !is_readable( $asset_file ) || !is_readable( $css ) ) {
            return;
        }
        $asset = (require $asset_file);
        wp_enqueue_style( 'wp-components' );
        // @wordpress/scripts extrae el CSS importado en index.js como
        // build/style-index.css (con su variante -rtl), no build/index.css.
        wp_enqueue_style(
            'entrepo-app',
            ENTREPO_URL . 'build/style-index.css',
            array('wp-components'),
            (string) $asset['version']
        );
        wp_style_add_data( 'entrepo-app', 'rtl', 'replace' );
    }

    /**
     * Valor de `esPro` que recibe el panel React.
     *
     * En el build FREE devuelve SIEMPRE `false` y no se consulta ninguna
     * licencia: Freemius retira el bloque `is__premium_only()` entero al
     * generar ese build, así que allí no queda ni la llamada. Es lo que exigen
     * las directrices de WordPress.org — el plugin del directorio no puede
     * condicionar funcionalidad a una licencia de pago.
     *
     * Y es coherente además: en el build free el código Pro tampoco viaja, de
     * modo que no hay nada que una licencia pudiera desbloquear. El panel pinta
     * la tarjeta «Función Pro» y ya.
     *
     * IMPORTANTE: el preprocesador de Freemius solo retira un `if` cuya
     * condición ÚNICA sea `is__premium_only()`. No combinarlo con `&&` ni
     * convertirlo en ternario.
     *
     * @return bool
     */
    private static function es_pro_panel() : bool {
        $es_pro = false;
        return $es_pro;
    }

}
