<?php
if (!defined('ABSPATH')) exit;

/**
 * Three.js-URLs + Globals für die Frontend-/Editor-Module (wp_enqueue_script + Inline).
 *
 * WICHTIG: Three.js wird AUSSCHLIESSLICH lokal aus vendor/three/ geladen.
 * Es darf NIEMALS ein CDN (z. B. esm.sh, unpkg, jsdelivr) verwendet werden –
 * weder als Primär-Quelle noch als Fallback. Fehlt vendor/three/, muss der
 * Ordner wiederhergestellt werden (siehe Plugin-Root /vendor/three/).
 */

function ce_pd_three_vendor_exists() {
    return file_exists(CE_PD_DIR . 'vendor/three/build/three.module.js');
}

function ce_pd_import_map_urls() {
    $base = CE_PD_URL;
    $v = ce_pd_asset_ver();
    return [
        /* Kein ?ver= hier: JSM-Addons importieren ../../../build/three.module.js relativ —
         * der Browser löst das ohne Query auf. Mit ?ver= wäre es eine zweite Modul-URL und
         * Three.js würde „Multiple instances“ warnen. Addons behalten ?ver= für Cache-Busting. */
        'three' => $base . 'vendor/three/build/three.module.js',
        'three/examples/jsm/controls/OrbitControls.js' => add_query_arg('ver', $v, $base . 'vendor/three/examples/jsm/controls/OrbitControls.js'),
        'three/examples/jsm/geometries/RoundedBoxGeometry.js' => add_query_arg('ver', $v, $base . 'vendor/three/examples/jsm/geometries/RoundedBoxGeometry.js'),
        'three/examples/jsm/objects/Reflector.js' => add_query_arg('ver', $v, $base . 'vendor/three/examples/jsm/objects/Reflector.js'),
    ];
}

/**
 * Ob die WebGL-Debug-Ausgaben im Frontend aktiv sind (window.__CE_PD_DEBUG_WEBGL__).
 * Priorität: Konstante CE_PD_DEBUG_WEBGL → Filter ce_pd_debug_webgl → Standard (aus).
 * Zum Debuggen: define('CE_PD_DEBUG_WEBGL', true); oder add_filter('ce_pd_debug_webgl', '__return_true');
 */
function ce_pd_debug_webgl_enabled() {
    if (defined('CE_PD_DEBUG_WEBGL')) {
        return (bool) CE_PD_DEBUG_WEBGL;
    }
    return (bool) apply_filters('ce_pd_debug_webgl', false);
}

function ce_pd_troika_urls() {
    $base = CE_PD_URL;
    $v = ce_pd_asset_ver();
    /* Troika ESM-Files importieren ihre Geschwister-Module per relativem Pfad
     * (in vendor/troika gepatcht), genau wie three/examples/jsm. Daher reicht
     * eine URL fürs Eintritts-Modul; die anderen Files werden vom Browser
     * automatisch nachgezogen. */
    return [
        'textModule'   => add_query_arg('ver', $v, $base . 'vendor/troika/troika-three-text.esm.js'),
        /* TTF-Dateien dürfen nicht mit ?ver= geladen werden, weil Troika die URL
         * ans Worker-Atlas-Caching weitergibt — aber wir wollen Cache-Busting bei
         * Plugin-Update. Lösung: zusätzliches `?ver=` ist für TTF unproblematisch
         * (Browser lädt einfach neu, Troika nimmt die URL als Atlas-Key). */
        'fontBoldUrl'  => add_query_arg('ver', $v, $base . 'assets/BarlowSemiCondensed-Bold.ttf'),
        'fontLightUrl' => add_query_arg('ver', $v, $base . 'assets/BarlowSemiCondensed-Light.ttf'),
        /* Optional: nur für ausgewählte Glyphen (z. B. Lineal-%), Ziffern bleiben Bold. */
        'fontExtraBoldUrl' => add_query_arg('ver', $v, $base . 'assets/BarlowSemiCondensed-ExtraBold.ttf'),
    ];
}

/**
 * Inline-JavaScript für window.__CE_PD_* (ohne Umhüllung — für wp_add_inline_script).
 */
function ce_pd_globals_inline_js() {
    $urls        = ce_pd_import_map_urls();
    $troika_urls = ce_pd_troika_urls();
    return sprintf(
        'window.__CE_PD_ASSET_VER__=%1$s;window.__CE_PD_DEBUG_WEBGL__=%2$s;window.__CE_PD_THREE_IMPORTS__=%3$s;window.__CE_PD_TROIKA__=%4$s;',
        wp_json_encode(ce_pd_asset_ver()),
        wp_json_encode(ce_pd_debug_webgl_enabled()),
        wp_json_encode(
            [
                'three'      => esc_url_raw($urls['three']),
                'orbit'      => esc_url_raw($urls['three/examples/jsm/controls/OrbitControls.js']),
                'roundedBox' => esc_url_raw($urls['three/examples/jsm/geometries/RoundedBoxGeometry.js']),
                'reflector'  => esc_url_raw($urls['three/examples/jsm/objects/Reflector.js']),
            ]
        ),
        wp_json_encode(
            [
                'textModule'   => esc_url_raw($troika_urls['textModule']),
                'fontBoldUrl'  => esc_url_raw($troika_urls['fontBoldUrl']),
                'fontLightUrl' => esc_url_raw($troika_urls['fontLightUrl']),
                'fontExtraBoldUrl' => esc_url_raw($troika_urls['fontExtraBoldUrl']),
            ]
        )
    );
}

/**
 * Registriert das Dummy-Handle für Inline-Globals (kein externes JS-File).
 */
function ce_pd_register_globals_script() {
    if (wp_script_is('ce-pd-globals', 'registered')) {
        return;
    }
    wp_register_script(
        'ce-pd-globals',
        false,
        [],
        CE_PD_VERSION,
        false
    );
}

/**
 * Enqueued genau einmal pro Request: __CE_PD_ASSET_VER__, __CE_PD_DEBUG_WEBGL__,
 * __CE_PD_THREE_IMPORTS__, __CE_PD_TROIKA__. Eine importmap ist NICHT nötig:
 * Vendor-JSM importiert three.module.js per relativem Pfad statt bare-specifier
 * `three`. Bei vendor/three-Updates die gepatchten Files erneut prüfen.
 */
function ce_pd_enqueue_globals() {
    static $done = false;
    if ($done) {
        return;
    }
    $done = true;

    ce_pd_register_globals_script();
    wp_enqueue_script('ce-pd-globals');
    wp_add_inline_script('ce-pd-globals', ce_pd_globals_inline_js(), 'after');
}

add_action('init', 'ce_pd_register_globals_script', 0);

/**
 * Stabiles id="ce-pd-globals" wie früher beim Raw-printf (DevTools / Reviews).
 */
add_filter(
    'script_loader_tag',
    static function ($tag, $handle) {
        if ($handle !== 'ce-pd-globals' || strpos($tag, ' id=') !== false) {
            return $tag;
        }
        return preg_replace('/^<script\s/', '<script id="ce-pd-globals" ', $tag, 1);
    },
    10,
    2
);

add_action(
    'wp_enqueue_scripts',
    static function () {
        if (ce_pd_has_block()) {
            ce_pd_enqueue_globals();
            return;
        }
        /* _wp_current_template_content is a WordPress core global; read it via
         * $GLOBALS to avoid exposing it as an unprefixed plugin variable. */
        $ce_pd_current_template_content = isset($GLOBALS['_wp_current_template_content'])
            ? $GLOBALS['_wp_current_template_content']
            : null;
        if (!empty($ce_pd_current_template_content) && ce_pd_has_block($ce_pd_current_template_content)) {
            ce_pd_enqueue_globals();
        }
    },
    -9999
);

add_action(
    'admin_enqueue_scripts',
    static function () {
        global $pagenow;
        if (!in_array($pagenow, ['post.php', 'post-new.php', 'site-editor.php'], true)) {
            return;
        }
        ce_pd_enqueue_globals();
    },
    -9999
);

add_action(
    'wp_footer',
    static function () {
        if (defined('CE_PD_BLOCK_RENDERED')) {
            ce_pd_enqueue_globals();
        }
    },
    1
);
