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

function Mirai_pointsGetRate() {
    $options = Mirai_opt();
    return isset($options->pointsRate) ? (int)$options->pointsRate : 30;
}

function Mirai_pointsGetProducts() {
    $options = Mirai_opt();
    $rate = Mirai_pointsGetRate();
    $products = [
        ['id' => 'points_1', 'points' => 300, 'price' => round(300 / $rate, 2)],
        ['id' => 'points_2', 'points' => 1000, 'price' => round(1000 / $rate, 2)],
        ['id' => 'points_3', 'points' => 3000, 'price' => round(3000 / $rate, 2)],
        ['id' => 'points_4', 'points' => 5000, 'price' => round(5000 / $rate, 2)],
    ];
    return $products;
}

function Mirai_pointsGetPurchaseLimits() {
    $options = Mirai_opt();
    return [
        'min' => isset($options->pointsPurchaseMin) ? (int)$options->pointsPurchaseMin : 300,
        'max' => isset($options->pointsPurchaseMax) ? (int)$options->pointsPurchaseMax : 50000,
    ];
}

function Mirai_pointsProcessPurchase($uid, $pointsAmount) {
    if (!$uid) return ['success' => false, 'msg' => '请先登录'];
    if (!Mirai_pointsEnabled()) return ['success' => false, 'msg' => '积分功能未启用'];

    $limits = Mirai_pointsGetPurchaseLimits();
    if ($pointsAmount < $limits['min'] || $pointsAmount > $limits['max']) {
        return ['success' => false, 'msg' => Mirai_pointsName() . '数量需在' . $limits['min'] . '-' . $limits['max'] . '之间'];
    }

    $rate = Mirai_pointsGetRate();
    if ($rate <= 0) return ['success' => false, 'msg' => '汇率配置错误'];
    $price = round($pointsAmount / $rate, 2);
    if ($price <= 0) return ['success' => false, 'msg' => '金额无效'];

    if (!function_exists('Mirai_payCreateOrder')) {
        return ['success' => false, 'msg' => '支付系统未就绪'];
    }

    $orderNo = function_exists('Mirai_payGenerateOrderNo') ? Mirai_payGenerateOrderNo() : 'MR' . bin2hex(random_bytes(10));

    $orderData = [
        'order_no' => $orderNo,
        'uid' => $uid,
        'cid' => 0,
        'author_id' => 0,
        'order_type' => 'points_purchase',
        'product_title' => '购买' . $pointsAmount . Mirai_pointsName(),
        'payment_method' => 'balance',
        'amount' => $price,
        'income_price' => 0,
        'income_status' => 0,
        'status' => 'pending',
        'ip_address' => $_SERVER['REMOTE_ADDR'] ?? '',
        'guest_token' => '',
        'query_token' => '',
        'meta' => json_encode(['points_amount' => $pointsAmount]),
        'created' => time(),
        'paid_at' => 0,
    ];

    try {
        $db = \Typecho\Db::get();
        $orderTable = Mirai_pointsTable('mirai_pay_orders');
        $db->query($db->insert($orderTable)->rows($orderData));
        return ['success' => true, 'order_no' => $orderNo, 'amount' => $price, 'points' => $pointsAmount];
    } catch (\Exception $e) {
        return ['success' => false, 'msg' => '创建订单失败: ' . $e->getMessage()];
    }
}
