<?php

/**
 * Orquestador principal: instancia y conecta los módulos con WordPress/WooCommerce.
 *
 * En la Fase 0 el arranque es mínimo (solo la rutina de upgrade del esquema);
 * los módulos de precios, IVA y panel se cablean en fases posteriores.
 *
 * @package Entrepo
 */
namespace Entrepo\Core;

use Entrepo\Persistencia\Migrations;
defined( 'ABSPATH' ) || exit;
/**
 * Orquestador principal del plugin (patrón singleton).
 *
 * Instancia y conecta los módulos de dominio con los hooks de WordPress/WooCommerce.
 */
final class Plugin {
    /**
     * Instancia única del plugin.
     *
     * @var Plugin|null
     */
    private static ?Plugin $instance = null;

    /**
     * Devuelve la instancia única del plugin, creándola la primera vez que se pide.
     *
     * @return Plugin
     */
    public static function instance() : Plugin {
        if ( null === self::$instance ) {
            self::$instance = new self();
        }
        return self::$instance;
    }

    /**
     * Registra todos los hooks. Se llama una sola vez en 'plugins_loaded'.
     */
    public function boot() : void {
        // Rutina de upgrade: si el esquema instalado quedó desactualizado, migra.
        if ( (string) get_option( 'entrepo_db_version' ) !== Migrations::SCHEMA_VERSION ) {
            Migrations::run();
            update_option( 'entrepo_db_version', Migrations::SCHEMA_VERSION, false );
        }
        // Traducciones: WordPress 6.6+ carga el textdomain 'entrepo' de forma
        // automática (just-in-time) desde languages/ y desde translate.wordpress.org
        // para el build de .org, sin registro manual del textdomain.
        ( new \Entrepo\WooCommerce\PrecioHooks() )->register();
        ( new \Entrepo\WooCommerce\VisibilidadHooks() )->register();
        ( new \Entrepo\Cuenta\RegistroB2B() )->register();
        // Rutas REST del panel (siempre: tambien las necesita el propio admin
        // vía api-fetch, y en un futuro podrian consumirlas otros clientes).
        ( new \Entrepo\Rest\RestBootstrap() )->register();
        // Recalculo masivo de la matriz de precios (F3-3): SIEMPRE, no solo
        // is_admin() -- los lotes los ejecuta el runner de Action Scheduler
        // (cron/AS-Async-Request), que no es una pantalla de administracion.
        \Entrepo\Infra\RecalcJob::register();
        // Panel de administracion (React).
        if ( is_admin() ) {
            ( new \Entrepo\Admin\AdminMenu() )->register();
        }
    }

}
