<?php
namespace NeoDuplicateFull\NeoGlobal; if (!defined("ABSPATH")) { die("neoWP direct access not allowed"); }




// Central point to enqueue CSS files using the standard WordPress functions
function enqueue_css($relative_path) {
    if (\NeoDuplicateFull\NeoGlobal\val("neo_global__enqueue_disallowed") !== null) { \NeoDuplicateFull\NeoGlobal\throw_global_exception("Enqueueing CSS files is disallowed in this section of code: " . \NeoDuplicateFull\NeoGlobal\val("neo_global__enqueue_disallowed")); }
    wp_enqueue_style(
        handle: "neo-duplicate-full--" . \NeoDuplicateFull\NeoGlobal\preg_replace_better('/[^a-zA-Z0-9]+/', "-", $relative_path),
        src: \NeoDuplicateFull\NeoGlobal\plugin_url() . "/" . $relative_path,
        deps: [],
        ver: "1",
    );
}


// Central point to enqueue JS files using the standard WordPress functions
function enqueue_js($relative_path, $dependencies=[]) {
    if (\NeoDuplicateFull\NeoGlobal\val("neo_global__enqueue_disallowed") !== null) { \NeoDuplicateFull\NeoGlobal\throw_global_exception("Enqueueing JS files is disallowed in this section of code: " . \NeoDuplicateFull\NeoGlobal\val("neo_global__enqueue_disallowed")); }
    $add_type_module = empty($dependencies);
    wp_enqueue_script(
        "neo-duplicate-full--" . ($add_type_module ? "module--" : "") . \NeoDuplicateFull\NeoGlobal\preg_replace_better('/[^a-zA-Z0-9]+/', "-", $relative_path),
        \NeoDuplicateFull\NeoGlobal\plugin_url() . "/" . $relative_path,
        $dependencies,
        "1",
        false,
    );
}

\NeoDuplicateFull\NeoGlobal\add_filter_hook("script_loader_tag", function ($tag, $handle, $src) {
    if (!str_starts_with($handle, "neo-duplicate-full--")) { return $tag; }

    $script_var_name = str_replace("-", "_", $handle) . "_script";

    $tag = "<script>" .
            "const " . $script_var_name . ' = document.createElement("script");' .
            (str_contains($handle, "module--") ? ($script_var_name . '.type = "module";') : "") .
            $script_var_name . '.src = "' . esc_url($src) . '";' .
            "document.head.appendChild(" . $script_var_name . ");" .
        "</script>";
    return $tag;
});


\NeoDuplicateFull\NeoGlobal\val("neo_global__enqueue_disallowed", null);
function disallow_enqueue($reason_string, $callback) {
    try {
        \NeoDuplicateFull\NeoGlobal\val("neo_global__enqueue_disallowed", $reason_string);
        $callback();
    } finally { \NeoDuplicateFull\NeoGlobal\val("neo_global__enqueue_disallowed", null); }
}



// Central point to enqueue JS variables using standard WordPress functions
\NeoDuplicateFull\NeoGlobal\val("neo_global__enqueue_js_variables", []);
function _enqueue_js_var($backend_or_frontend, $var_name, $var_value) {

    if ((\NeoDuplicateFull\NeoGlobal\val("neo_global__enqueue_js_variables")[$backend_or_frontend] ?? null) === "#neoEnqueueTooLate") { \NeoDuplicateFull\NeoGlobal\throw_global_exception("The JS variable '$var_name' cannot be registered for the $backend_or_frontend because the corresponding enqueue action has already been run. Please register the variable earlier."); }
    if (!\NeoDuplicateFull\NeoGlobal\preg_match_better('/^[a-zA-Z][a-zA-Z0-9_]*$/', $var_name)) { \NeoDuplicateFull\NeoGlobal\throw_global_exception("Invalid JS variable name '$var_name'."); }
    if (isset(\NeoDuplicateFull\NeoGlobal\val("neo_global__enqueue_js_variables")[$backend_or_frontend][$var_name])) { \NeoDuplicateFull\NeoGlobal\throw_global_exception("The JS variable '$var_name' has already been registered for the $backend_or_frontend. Please use a unique name for each variable."); }

    \NeoDuplicateFull\NeoGlobal\val("neo_global__enqueue_js_variables")[$backend_or_frontend][$var_name] = $var_value;
}
function enqueue_js_variable_backend             ($var_name, $var_value) { _enqueue_js_var("backend",  $var_name, $var_value); }
function enqueue_js_variable_frontend            ($var_name, $var_value) { _enqueue_js_var("frontend", $var_name, $var_value); }
function enqueue_js_variable_backend_and_frontend($var_name, $var_value) { enqueue_js_variable_backend($var_name, $var_value); enqueue_js_variable_frontend($var_name, $var_value); }

\NeoDuplicateFull\NeoGlobal\val("neo_global__enqueue_inline_before_callbacks", []);
function callback_before_enqueue_js_variables_backend_or_frontend($callback) {
    foreach (["backend", "frontend"] as $backend_or_frontend) {
        if ((\NeoDuplicateFull\NeoGlobal\val("neo_global__enqueue_js_variables")[$backend_or_frontend] ?? null) === "#neoEnqueueTooLate") { \NeoDuplicateFull\NeoGlobal\throw_global_exception("The callback cannot be registered because the '$backend_or_frontend' JS variables have already been enqueued. Please register the callback earlier."); }
        \NeoDuplicateFull\NeoGlobal\val("neo_global__enqueue_inline_before_callbacks")[$backend_or_frontend][] = $callback;
    }
}

function get_code_for_js_variables($backend_or_frontend) {
    if (!in_array($backend_or_frontend, ["backend", "frontend"])) { \NeoDuplicateFull\NeoGlobal\throw_global_exception("Invalid parameter 'backend_or_frontend': '$backend_or_frontend'."); }
    foreach (\NeoDuplicateFull\NeoGlobal\val("neo_global__enqueue_inline_before_callbacks")[$backend_or_frontend] ?? [] as $callback) { $callback(); }
    \NeoDuplicateFull\NeoGlobal\val("neo_global__enqueue_inline_before_callbacks")[$backend_or_frontend] = [];
    $code = "/* Enqueued JS Variablen */ window.neoGlobalEnqueue" . ucfirst($backend_or_frontend) . "NeoDuplicateFull = {"; foreach (\NeoDuplicateFull\NeoGlobal\val("neo_global__enqueue_js_variables")[$backend_or_frontend] ?? [] as $js_var_name => $value) { $code .= "'$js_var_name': " . \NeoDuplicateFull\NeoGlobal\php_to_js_object($value) . ", "; } $code .= "};";
    return $code;
}

(function () {
    foreach (["backend", "frontend"] as $backend_or_frontend) {
        $enqueue_variables = function () use ($backend_or_frontend) {
            if ((\NeoDuplicateFull\NeoGlobal\val("neo_global__enqueue_js_variables")[$backend_or_frontend] ?? null) === "#neoEnqueueTooLate") { \NeoDuplicateFull\NeoGlobal\global_warn_with_module_name("_global--enqueue-loader", "JS variables for '$backend_or_frontend' were enqueued twice in the same request. This likely means that multiple enqueue hooks fired, e.g. admin_enqueue_scripts and elementor/editor/before_enqueue_scripts."); return; }
            $handle = "neo_global__enqueue_js_variable_" . $backend_or_frontend . "_neo-duplicate-full";
            wp_register_script($handle, false, [], "1", false); wp_enqueue_script($handle);
            wp_add_inline_script($handle, get_code_for_js_variables($backend_or_frontend), "before");
            \NeoDuplicateFull\NeoGlobal\val("neo_global__enqueue_js_variables")[$backend_or_frontend] = "#neoEnqueueTooLate";
        };
        if ($backend_or_frontend === "backend")  { \NeoDuplicateFull\NeoGlobal\add_action_hook("admin_enqueue_scripts:0", "elementor/editor/before_enqueue_scripts:0", $enqueue_variables); }
        if ($backend_or_frontend === "frontend") { \NeoDuplicateFull\NeoGlobal\add_action_hook("wp_enqueue_scripts:0", $enqueue_variables); }
    }
})();
