<?php
/**
 * RiPro-V5 Child Theme - Binance Edition
 *
 * 此子主题完整重做前端视觉（PC + Mobile），保留父主题的所有后端逻辑、商城、支付、SEO。
 * 设计语言：币安深色 + 亮黄（Binance Public API 行情接入）
 */

defined('ABSPATH') || exit;

define('RIPRO_CHILD_VERSION', '1.0.5');
define('RIPRO_CHILD_DIR', get_stylesheet_directory());
define('RIPRO_CHILD_URI', get_stylesheet_directory_uri());

/**
 * 加载子主题资源（确保在父主题之后加载）
 */
function ripro_child_enqueue_assets() {

    // Google Fonts - Inter（专业金融风格）
    wp_enqueue_style(
        'ripro-child-fonts',
        'https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&family=JetBrains+Mono:wght@500;700&display=swap',
        array(),
        null
    );

    // 父主题样式（保持兼容）
    wp_enqueue_style(
        'ripro-parent-style',
        get_template_directory_uri() . '/style.css',
        array(),
        _THEME_VERSION
    );

    // 子主题核心样式（变量系统 + 组件重写）
    wp_enqueue_style(
        'ripro-child-theme',
        RIPRO_CHILD_URI . '/assets/css/theme.css',
        array('ripro-parent-style'),
        RIPRO_CHILD_VERSION
    );

    // 子主题分层样式
    wp_enqueue_style(
        'ripro-child-header',
        RIPRO_CHILD_URI . '/assets/css/header.css',
        array('ripro-child-theme'),
        RIPRO_CHILD_VERSION
    );

    wp_enqueue_style(
        'ripro-child-loop',
        RIPRO_CHILD_URI . '/assets/css/loop.css',
        array('ripro-child-theme'),
        RIPRO_CHILD_VERSION
    );

    wp_enqueue_style(
        'ripro-child-widget',
        RIPRO_CHILD_URI . '/assets/css/widget.css',
        array('ripro-child-theme'),
        RIPRO_CHILD_VERSION
    );

    wp_enqueue_style(
        'ripro-child-single',
        RIPRO_CHILD_URI . '/assets/css/single.css',
        array('ripro-child-theme'),
        RIPRO_CHILD_VERSION
    );

    wp_enqueue_style(
        'ripro-child-archive',
        RIPRO_CHILD_URI . '/assets/css/archive.css',
        array('ripro-child-theme'),
        RIPRO_CHILD_VERSION
    );

    wp_enqueue_style(
        'ripro-child-footer',
        RIPRO_CHILD_URI . '/assets/css/footer.css',
        array('ripro-child-theme'),
        RIPRO_CHILD_VERSION
    );

    wp_enqueue_style(
        'ripro-child-mobile',
        RIPRO_CHILD_URI . '/assets/css/mobile.css',
        array('ripro-child-theme'),
        RIPRO_CHILD_VERSION
    );

    // 新增：行情 / 数字滚动 / 图表样式
    wp_enqueue_style(
        'ripro-child-countup',
        RIPRO_CHILD_URI . '/assets/css/countup.css',
        array('ripro-child-theme'),
        RIPRO_CHILD_VERSION
    );

    wp_enqueue_style(
        'ripro-child-ticker',
        RIPRO_CHILD_URI . '/assets/css/ticker.css',
        array('ripro-child-theme'),
        RIPRO_CHILD_VERSION
    );

    wp_enqueue_style(
        'ripro-child-chart',
        RIPRO_CHILD_URI . '/assets/css/chart.css',
        array('ripro-child-theme'),
        RIPRO_CHILD_VERSION
    );

    // 首页专属样式
    wp_enqueue_style(
        'ripro-child-home',
        RIPRO_CHILD_URI . '/assets/css/home.css',
        array('ripro-child-theme', 'ripro-child-countup', 'ripro-child-chart'),
        RIPRO_CHILD_VERSION
    );

    // 子主题交互脚本
    wp_enqueue_script(
        'ripro-child-theme',
        RIPRO_CHILD_URI . '/assets/js/theme.js',
        array('jquery'),
        RIPRO_CHILD_VERSION,
        true
    );

    // 数字滚动
    wp_enqueue_script(
        'ripro-child-countup',
        RIPRO_CHILD_URI . '/assets/js/countup.js',
        array(),
        RIPRO_CHILD_VERSION,
        true
    );

    // 行情 / K 线（依赖 jQuery + countup）
    wp_enqueue_script(
        'ripro-child-market',
        RIPRO_CHILD_URI . '/assets/js/market.js',
        array('jquery', 'ripro-child-countup'),
        RIPRO_CHILD_VERSION,
        true
    );

    // 首页交互（建设中弹窗等）
    wp_enqueue_script(
        'ripro-child-home',
        RIPRO_CHILD_URI . '/assets/js/home.js',
        array('jquery'),
        RIPRO_CHILD_VERSION,
        true
    );
}
add_action('wp_enqueue_scripts', 'ripro_child_enqueue_assets', 100);

/**
 * body class 扩展
 */
function ripro_child_body_classes($classes) {
    $classes[] = 'ripro-child';
    $classes[] = 'ripro-binance';
    return $classes;
}
add_filter('body_class', 'ripro_child_body_classes');

/**
 * 在 html 标签上追加 child 标识
 */
function ripro_child_html_attr() {
    echo ' data-child-theme="binance"';
}
add_action('language_attributes', 'ripro_child_html_attr');

/**
 * ============================================================
 * 首页 widget 按 classname 精确渲染（复刻 WP dynamic_sidebar 逻辑）
 * 保留后台拖拽配置的实例数据，允许任意重排顺序
 *
 * @param array $include_classes 只渲染这些 classname（为空 = 渲染全部）
 * @param array $exclude_classes 排除这些 classname
 * @param array $exclude_ids     排除这些 widget ID（用于精确移除广告等指定 widget）
 * ============================================================
 */
function bn_render_home_widgets($include_classes = array(), $exclude_classes = array(), $exclude_ids = array()) {
    global $wp_registered_sidebars, $wp_registered_widgets;

    $index = 'home-center';
    if (empty($wp_registered_sidebars[$index])) {
        return;
    }

    $sidebars_widgets = wp_get_sidebars_widgets();
    if (empty($sidebars_widgets[$index]) || !is_array($sidebars_widgets[$index])) {
        return;
    }

    $sidebar = $wp_registered_sidebars[$index];

    foreach ((array) $sidebars_widgets[$index] as $id) {
        if (!isset($wp_registered_widgets[$id])) {
            continue;
        }

        // 按 widget ID 精确排除（如广告 banner）
        if (!empty($exclude_ids) && in_array($id, $exclude_ids, true)) {
            continue;
        }

        // 计算 classname（与 WP core dynamic_sidebar 完全一致）
        $classname_ = '';
        foreach ((array) $wp_registered_widgets[$id]['classname'] as $cn) {
            if (is_string($cn)) {
                $classname_ .= '_' . $cn;
            } elseif (is_object($cn)) {
                $classname_ .= '_' . get_class($cn);
            }
        }
        $classname_ = ltrim($classname_, '_');

        // 包含/排除过滤
        if (!empty($include_classes) && !in_array($classname_, $include_classes, true)) {
            continue;
        }
        if (!empty($exclude_classes) && in_array($classname_, $exclude_classes, true)) {
            continue;
        }

        $params = array_merge(
            array(
                array_merge(
                    $sidebar,
                    array(
                        'widget_id'   => $id,
                        'widget_name' => $wp_registered_widgets[$id]['name'],
                    )
                ),
            ),
            (array) $wp_registered_widgets[$id]['params']
        );

        $params[0]['before_widget'] = sprintf(
            $params[0]['before_widget'],
            str_replace('\\', '_', $id),
            $classname_
        );

        $params = apply_filters('dynamic_sidebar_params', $params);

        $callback = $wp_registered_widgets[$id]['callback'];
        if (is_callable($callback)) {
            call_user_func_array($callback, $params);
        }
    }
}

/**
 * 注入子主题全局配置到 JS
 */
function ripro_child_localize_market() {
    $default_symbols = array('BTCUSDT', 'ETHUSDT', 'BNBUSDT', 'SOLUSDT', 'XRPUSDT', 'DOGEUSDT', 'ADAUSDT', 'AVAXUSDT');

    // 允许通过主题设置覆盖（site_market_ticker_symbols）
    $ticker_symbols = _cao('site_market_ticker_symbols', '');
    if (!empty($ticker_symbols)) {
        $default_symbols = array_map('trim', explode(',', strtoupper($ticker_symbols)));
    }

    wp_localize_script('ripro-child-market', 'RiproMarketConfig', array(
        'symbols'  => $default_symbols,
        'ajax_url' => admin_url('admin-ajax.php'),
        'refresh'  => 60,
    ));
}
add_action('wp_enqueue_scripts', 'ripro_child_localize_market', 101);

/**
 * =====================================================================
 * 市场行情服务端代理（安全加固版 —— 修复导致服务器卡死的隐患）
 * 前端请求: admin-ajax.php?action=ripro_market&req_type=ticker|kline
 * 安全措施:
 *   1. 短超时（4 秒/端点）—— PHP 进程不会长时间挂起
 *   2. 加锁：同一时刻只允许一个请求去抓取上游，其余请求立即返回缓存/旧数据，
 *      防止“缓存过期瞬间并发抓取”拖垮 PHP-FPM
 *   3. 熔断：连续 3 次上游失败后 10 分钟内不再主动连接，只返回缓存/旧数据
 * =====================================================================
 */
function ripro_child_market_endpoints() {
    return array(
        'https://data-api.binance.vision/api/v3',
        'https://api.binance.com/api/v3',
    );
}

function ripro_child_binance_request($path) {
    // 熔断冷却期内不再连接上游
    if (get_transient('ripro_mkt_breaker')) {
        return null;
    }

    $endpoints = ripro_child_market_endpoints();
    foreach ($endpoints as $ep) {
        $resp = wp_remote_get($ep . $path, array(
            'timeout'   => 4,
            'headers'   => array('User-Agent' => 'Mozilla/5.0 (compatible; RiproMarket/1.0)'),
        ));
        if (is_wp_error($resp)) {
            continue;
        }
        if (wp_remote_retrieve_response_code($resp) !== 200) {
            continue;
        }
        $json = json_decode(wp_remote_retrieve_body($resp), true);
        if (!is_array($json)) {
            continue;
        }
        // 抓取成功 → 重置失败计数
        delete_transient('ripro_mkt_failcount');
        return $json;
    }

    // 记录失败，连续 3 次失败触发熔断（10 分钟冷却）
    $fails = intval(get_transient('ripro_mkt_failcount')) + 1;
    if ($fails >= 3) {
        set_transient('ripro_mkt_breaker', 1, 600);
        delete_transient('ripro_mkt_failcount');
    } else {
        set_transient('ripro_mkt_failcount', $fails, 300);
    }
    return null;
}

/**
 * 带锁抓取 + 旧数据兜底（防止并发踩踏）
 */
function ripro_child_market_fetch($cache_key, $path, $ttl) {
    $cached = get_transient($cache_key);
    if ($cached !== false) {
        return $cached;
    }

    $stale_key = 'ripro_stale_' . $cache_key;
    $stale     = get_option($stale_key);

    // 抓取锁：已有请求在抓上游时，直接返回旧数据（不等待、不重复抓）
    $lock_key = 'ripro_mklock_' . md5($cache_key);
    if (get_transient($lock_key)) {
        return ($stale !== false) ? $stale : null;
    }
    set_transient($lock_key, 1, 12);

    $data = ripro_child_binance_request($path);
    delete_transient($lock_key);

    if ($data === null) {
        return ($stale !== false) ? $stale : null;
    }

    set_transient($cache_key, $data, $ttl);
    update_option($stale_key, $data, false);
    return $data;
}

function ripro_child_market_ajax() {
    $req_type = isset($_REQUEST['req_type']) ? sanitize_key($_REQUEST['req_type']) : 'ticker';

    // ---------------- K 线 ----------------
    if ($req_type === 'kline') {
        $symbol   = isset($_REQUEST['symbol']) ? strtoupper(sanitize_text_field(wp_unslash($_REQUEST['symbol']))) : 'BTCUSDT';
        $interval = isset($_REQUEST['interval']) ? sanitize_key($_REQUEST['interval']) : '1h';
        $limit    = isset($_REQUEST['limit']) ? intval($_REQUEST['limit']) : 80;

        if (!preg_match('/^[A-Z0-9]{5,14}$/', $symbol)) {
            wp_send_json_error('bad symbol');
        }
        $allowed = array('1m', '3m', '5m', '15m', '30m', '1h', '2h', '4h', '6h', '8h', '12h', '1d', '3d', '1w');
        if (!in_array($interval, $allowed, true)) {
            $interval = '1h';
        }
        $limit = max(10, min(500, $limit));

        $cache_key = 'ripro_mk_' . $symbol . '_' . $interval . '_' . $limit;
        $path      = '/klines?symbol=' . $symbol . '&interval=' . $interval . '&limit=' . $limit;
        $data      = ripro_child_market_fetch($cache_key, $path, 20);

        if ($data === null) {
            wp_send_json_error('upstream failed');
        }
        wp_send_json_success($data);
    }

    // ---------------- 24h Ticker ----------------
    $symbols_raw = isset($_REQUEST['symbols']) ? sanitize_text_field(wp_unslash($_REQUEST['symbols'])) : 'BTCUSDT,ETHUSDT,BNBUSDT';
    $symbols = array_values(array_filter(array_map('trim', explode(',', strtoupper($symbols_raw)))));
    $symbols = array_slice($symbols, 0, 20);

    foreach ($symbols as $s) {
        if (!preg_match('/^[A-Z0-9]{5,14}$/', $s)) {
            wp_send_json_error('bad symbol');
        }
    }

    $cache_key = 'ripro_mt_' . md5(implode(',', $symbols));
    $path      = '/ticker/24hr?symbols=' . rawurlencode(wp_json_encode($symbols));
    $data      = ripro_child_market_fetch($cache_key, $path, 30);

    if ($data === null) {
        wp_send_json_error('upstream failed');
    }
    wp_send_json_success($data);
}
add_action('wp_ajax_ripro_market', 'ripro_child_market_ajax');
add_action('wp_ajax_nopriv_ripro_market', 'ripro_child_market_ajax');
