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

function Mirai_pointsPostSettings($cid) {
    $db = \Typecho\Db::get();
    $row = $db->fetchRow($db->select('int_value')->from('table.fields')
        ->where('cid = ? AND name = ?', $cid, 'pay_points_price'));
    $pointsPrice = (int)($row['int_value'] ?? 0);

    $paySettings = [];
    if (function_exists('Mirai_payPostSettings')) {
        $paySettings = Mirai_payPostSettings($cid);
    }

    return array_merge($paySettings ?: [], [
        'points_price' => $pointsPrice,
        'points_mode' => $pointsPrice > 0,
    ]);
}

function Mirai_pointsHasPaid($cid, $uid) {
    if ($uid <= 0) return false;
    $db = \Typecho\Db::get();
    $orderTable = Mirai_pointsTable('mirai_pay_orders');
    $row = $db->fetchRow($db->select(['COUNT(*)' => 'cnt'])->from($orderTable)
        ->where('uid = ? AND cid = ? AND order_type = ? AND status = ?', $uid, $cid, 'points_pay', 'paid'));
    return (int)($row['cnt'] ?? 0) > 0;
}

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

    $settings = Mirai_pointsPostSettings($cid);
    $pointsPrice = (int)($settings['points_price'] ?? 0);
    if ($pointsPrice <= 0) return ['success' => false, 'msg' => '该文章未设置积分价格'];

    if (Mirai_pointsHasPaid($cid, $uid)) return ['success' => false, 'msg' => '已购买过'];

    $balance = Mirai_pointsGetBalance($uid);
    if ($balance < $pointsPrice) return ['success' => false, 'msg' => Mirai_pointsName() . '不足，当前' . $balance . '，需要' . $pointsPrice];

    $db = \Typecho\Db::get();
    $postRow = $db->fetchRow($db->select('authorId')->from('table.contents')->where('cid = ?', $cid));
    $authorId = (int)($postRow['authorId'] ?? 0);

    if ($uid == $authorId) return ['success' => false, 'msg' => '不能购买自己的文章'];

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

    $result = Mirai_pointsAdjust($uid, -$pointsPrice, 'points_pay', 'post', $cid, '积分支付购买文章', $orderNo);
    if (!$result['success']) return $result;

    $incomePrice = 0;
    $incomeRatio = 60;
    if (function_exists('Mirai_referralGetIncomeRatio')) {
        $incomeRatio = Mirai_referralGetIncomeRatio($authorId);
    }
    $incomePrice = round($pointsPrice * $incomeRatio / 100);

    try {
        $orderTable = Mirai_pointsTable('mirai_pay_orders');
        $db->query($db->insert($orderTable)->rows([
            'order_no' => $orderNo,
            'uid' => $uid,
            'cid' => $cid,
            'author_id' => $authorId,
            'order_type' => 'points_pay',
            'product_title' => Mirai_pointsName() . '支付购买文章',
            'payment_method' => 'points',
            'amount' => $pointsPrice,
            'income_price' => $incomePrice,
            'income_status' => 0,
            'status' => 'paid',
            'ip_address' => $_SERVER['REMOTE_ADDR'] ?? '',
            'meta' => json_encode(['points_price' => $pointsPrice]),
            'created' => time(),
            'paid_at' => time(),
        ]));

        if (function_exists('Mirai_payFinalizeAccess')) {
            Mirai_payFinalizeAccess(['order_no' => $orderNo, 'cid' => $cid]);
        }

        return ['success' => true, 'order_no' => $orderNo, 'points_spent' => $pointsPrice];
    } catch (\Exception $e) {
        Mirai_pointsAdjust($uid, $pointsPrice, 'refund', 'post', $cid, '积分支付失败退回');
        return ['success' => false, 'msg' => '创建订单失败: ' . $e->getMessage()];
    }
}
