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

function Mirai_hideRenderLocked($type, $attrs, $result, $cid, $uid, $index = 0, $widget = null) {
    $reason = isset($result['reason']) ? $result['reason'] : '';

    switch ($type) {
        case 'reply':
            return Mirai_hideRenderReply($cid, $uid, $reason);
        case 'login':
            return Mirai_hideRenderLogin($reason);
        case 'vip':
            return Mirai_hideRenderVip($attrs, $result, $uid);
        case 'password':
            return Mirai_hideRenderPassword($attrs, $cid, $reason, $index, $widget);
        case 'level':
            return Mirai_hideRenderLevel($attrs, $result, $uid);
        case 'points':
            return Mirai_hideRenderPoints($attrs, $result, $cid, $uid, $index, $widget);
        default:
            return '<div class="mirai-hide-box"><div class="mirai-hide-text">隐藏内容，暂不支持此类型</div></div>';
    }
}

function Mirai_hideRenderLoginButton($text = '立即登录') {
    return '<a class="mirai-hide-login-btn" href="javascript:;" onclick="if(window.openLoginModal){openLoginModal();}return false;">' . $text . '</a>';
}

function Mirai_hideGetFormAction($widget) {
    if ($widget && isset($widget->permalink)) {
        return htmlspecialchars($widget->permalink, ENT_QUOTES, 'UTF-8');
    }
    return isset($_SERVER['REQUEST_URI']) ? htmlspecialchars((string)$_SERVER['REQUEST_URI'], ENT_QUOTES, 'UTF-8') : '';
}

function Mirai_hideRenderReply($cid, $uid, $reason) {
    if ($reason === 'not_logged_in') {
        return '<div class="mirai-hide-box" data-type="reply">'
            . '<div class="mirai-hide-action">此处内容已隐藏，请登录后评论查看</div>'
            . Mirai_hideRenderLoginButton('登录后评论')
            . '</div>';
    }
    return '<div class="mirai-hide-box" data-type="reply">'
        . '<div class="mirai-hide-action">此处内容已隐藏，请评论后刷新页面查看</div>'
        . '<a class="mirai-hide-login-btn" href="javascript:;" onclick="var el=document.getElementById(\'comment\');if(el)el.scrollIntoView({behavior:\'smooth\',block:\'start\'});">去评论</a>'
        . '</div>';
}

function Mirai_hideRenderLogin($reason) {
    return '<div class="mirai-hide-box" data-type="login">'
        . '<div class="mirai-hide-action">隐藏内容，请登录后查看</div>'
        . Mirai_hideRenderLoginButton()
        . '</div>';
}

function Mirai_hideRenderVip($attrs, $result, $uid) {
    $reason = isset($result['reason']) ? $result['reason'] : '';
    $requiredLevel = isset($result['required_level']) ? (int)$result['required_level'] : 1;
    $vipName = function_exists('Mirai_vipGetName') ? Mirai_vipGetName($requiredLevel) : '会员';

    // 未登录：使用弹窗登录按钮
    if ($reason === 'not_logged_in' || $uid <= 0) {
        return '<div class="mirai-hide-box" data-type="vip">'
            . '<div class="mirai-hide-action">此处内容已隐藏，' . htmlspecialchars($vipName, ENT_QUOTES, 'UTF-8') . '可见</div>'
            . Mirai_hideRenderLoginButton('登录后开通会员')
            . '</div>';
    }

    // 已登录但等级不足：跳转到会员页面
    if ($reason === 'level_low') {
        $upgradeLevel = $requiredLevel;
        $upgradeName = function_exists('Mirai_vipGetName') ? Mirai_vipGetName($upgradeLevel) : '会员';
        $vipPageUrl = \Typecho\Common::url('/user/vip', \Helper::options()->index);
        return '<div class="mirai-hide-box" data-type="vip">'
            . '<div class="mirai-hide-action">此处内容已隐藏，' . htmlspecialchars($upgradeName, ENT_QUOTES, 'UTF-8') . '可见</div>'
            . '<a class="mirai-hide-login-btn" href="' . htmlspecialchars($vipPageUrl, ENT_QUOTES, 'UTF-8') . '">升级会员</a>'
            . '</div>';
    }

    // 默认情况（已登录但非会员）：跳转到会员页面
    $vipPageUrl = \Typecho\Common::url('/user/vip', \Helper::options()->index);
    return '<div class="mirai-hide-box" data-type="vip">'
        . '<div class="mirai-hide-action">此处内容已隐藏，' . htmlspecialchars($vipName, ENT_QUOTES, 'UTF-8') . '可见</div>'
        . '<a class="mirai-hide-login-btn" href="' . htmlspecialchars($vipPageUrl, ENT_QUOTES, 'UTF-8') . '">开通会员</a>'
        . '</div>';
}

function Mirai_hideRenderPassword($attrs, $cid, $reason, $index = 0, $widget = null) {
    $desc = isset($attrs['desc']) ? htmlspecialchars($attrs['desc'], ENT_QUOTES, 'UTF-8') : '';
    $imgUrl = isset($attrs['img_url']) ? htmlspecialchars($attrs['img_url'], ENT_QUOTES, 'UTF-8') : '';
    $inputKey = 'mirai_hide_pwd_' . $cid . '_' . $index;

    $html = '<div class="mirai-hide-box mirai-hide-password" data-type="password">';

    if ($imgUrl !== '') {
        $html .= '<div class="mirai-hide-pass-img"><img src="' . $imgUrl . '" alt="提示图片" loading="lazy"></div>';
    }

    $html .= '<div class="mirai-hide-pass-body">';
    $html .= '<div class="mirai-hide-pass-title">隐藏内容，输入密码后查看</div>';

    if ($desc !== '') {
        $html .= '<div class="mirai-hide-pass-desc">' . $desc . '</div>';
    }

    if ($reason === 'wrong_password') {
        $html .= '<div class="mirai-hide-pass-error">密码输入错误，请重新输入</div>';
    }

    $formAction = Mirai_hideGetFormAction($widget);

    $html .= '<form class="mirai-hide-pass-form" action="' . $formAction . '" method="POST">';
    $html .= '<input type="password" name="' . $inputKey . '" class="mirai-hide-pass-input" placeholder="请输入密码" autocomplete="off">';
    $html .= '<button type="submit" class="mirai-hide-pass-btn">验证</button>';
    $html .= '</form>';
    $html .= '</div>';
    $html .= '</div>';

    return $html;
}

function Mirai_hideRenderLevel($attrs, $result, $uid) {
    $reason = isset($result['reason']) ? $result['reason'] : '';
    $minLevel = isset($attrs['min']) ? (int)$attrs['min'] : 1;
    $levelName = function_exists('Mirai_levelGetName') ? Mirai_levelGetName($minLevel) : 'LV' . $minLevel;

    if ($reason === 'not_logged_in') {
        return '<div class="mirai-hide-box" data-type="level">'
            . '<div class="mirai-hide-action">此处内容已隐藏，' . htmlspecialchars($levelName, ENT_QUOTES, 'UTF-8') . '及以上可见</div>'
            . Mirai_hideRenderLoginButton()
            . '</div>';
    }
    $currentLevel = isset($result['current_level']) ? (int)$result['current_level'] : 1;
    return '<div class="mirai-hide-box" data-type="level">'
        . '<div class="mirai-hide-action">此处内容已隐藏，' . htmlspecialchars($levelName, ENT_QUOTES, 'UTF-8') . '及以上可见</div>'
        . '<div style="margin-top:8px;font-size:13px;color:#64748b;">您当前等级：LV' . $currentLevel . '，继续活跃即可升级</div>'
        . '</div>';
}

function Mirai_hideRenderPoints($attrs, $result, $cid, $uid, $index = 0, $widget = null) {
    $reason = isset($result['reason']) ? $result['reason'] : '';
    $cost = Mirai_hideGetPointsCost($attrs);
    $pointsName = function_exists('Mirai_pointsName') ? htmlspecialchars(Mirai_pointsName(), ENT_QUOTES, 'UTF-8') : '积分';

    if ($reason === 'not_logged_in') {
        return '<div class="mirai-hide-box" data-type="points">'
            . '<div class="mirai-hide-action">此处内容需消耗' . $cost . $pointsName . '查看</div>'
            . Mirai_hideRenderLoginButton()
            . '</div>';
    }

    if ($reason === 'cost_missing') {
        return '<div class="mirai-hide-box" data-type="points">'
            . '<div class="mirai-hide-action">积分可见需指定消耗数量，请使用 [hide type="points" cost="10"] 格式</div>'
            . '</div>';
    }

    if ($reason === 'insufficient_balance') {
        $balance = isset($result['balance']) ? (int)$result['balance'] : 0;
        return '<div class="mirai-hide-box" data-type="points">'
            . '<div class="mirai-hide-action">此处内容需消耗' . $cost . $pointsName . '查看</div>'
            . '<div style="margin-top:8px;font-size:13px;color:#64748b;">您的' . $pointsName . '不足（当前：' . $balance . '）</div>'
            . '</div>';
    }

    if ($reason === 'points_system_disabled' || $reason === 'system_error') {
        return '<div class="mirai-hide-box" data-type="points">'
            . '<div class="mirai-hide-action">此处内容需消耗' . $cost . $pointsName . '查看</div>'
            . '<div style="margin-top:8px;font-size:13px;color:#ef4444;">系统暂不可用，请稍后再试</div>'
            . '</div>';
    }

    if ($reason === 'deduct_failed') {
        $msg = isset($result['msg']) ? $result['msg'] : '';
        return '<div class="mirai-hide-box" data-type="points">'
            . '<div class="mirai-hide-action">此处内容需消耗' . $cost . $pointsName . '查看</div>'
            . '<div style="margin-top:8px;font-size:13px;color:#ef4444;">' . htmlspecialchars($msg, ENT_QUOTES, 'UTF-8') . '</div>'
            . '</div>';
    }

    if ($reason === 'need_confirm') {
        $balance = isset($result['balance']) ? (int)$result['balance'] : 0;
        $formAction = Mirai_hideGetFormAction($widget);
        $csrfToken = htmlspecialchars(\Widget\Security::alloc()->getToken('api'), ENT_QUOTES, 'UTF-8');
        // Generate nonce for double-submit protection
        if (session_status() === PHP_SESSION_NONE) {
            @session_start();
        }
        $nonceKey = 'mirai_points_nonce_' . $cid . '_' . $index;
        $nonce = bin2hex(random_bytes(16));
        $_SESSION[$nonceKey] = $nonce;

        $html = '<div class="mirai-hide-box mirai-hide-points" data-type="points">';
        $html .= '<div class="mirai-hide-points-info">此处内容需消耗 <strong>' . $cost . '</strong> ' . $pointsName . '查看</div>';
        $html .= '<div class="mirai-hide-points-balance">当前' . $pointsName . '：<strong>' . $balance . '</strong></div>';
        $html .= '<form class="mirai-hide-pass-form" action="' . $formAction . '" method="POST">';
        $html .= '<input type="hidden" name="_mirai_token" value="' . $csrfToken . '">';
        $html .= '<input type="hidden" name="_mirai_nonce" value="' . htmlspecialchars($nonce, ENT_QUOTES, 'UTF-8') . '">';
        $html .= '<input type="hidden" name="mirai_hide_points_unlock" value="' . $cid . '">';
        $html .= '<input type="hidden" name="mirai_hide_points_idx" value="' . $index . '">';
        $html .= '<button type="submit" class="mirai-hide-pass-btn mirai-hide-points-btn">确认解锁</button>';
        $html .= '</form>';
        $html .= '</div>';

        return $html;
    }

    return '<div class="mirai-hide-box" data-type="points"><div class="mirai-hide-action">隐藏内容</div></div>';
}
