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

function Mirai_referralGetRebateTypes() {
    return ['read', 'partial', 'vip', 'recharge', 'points_purchase'];
}

function Mirai_referralGetRebateRatio($referrerUid, $orderType = '') {
    if (!Mirai_referralIsEnabled()) return 0;
    if (!$referrerUid) return 0;

    $options = Mirai_opt();
    $allowedTypes = isset($options->referralRebateTypes) ? $options->referralRebateTypes : '';
    $allowedArr = array_filter(array_map('trim', explode(',', $allowedTypes)));
    if ($orderType !== '' && !empty($allowedArr) && !in_array('all', $allowedArr) && !in_array($orderType, $allowedArr)) return 0;

    if (function_exists('Mirai_vipCheckUserValid')) {
        $vipStatus = Mirai_vipCheckUserValid($referrerUid);
        if ($vipStatus['is_valid'] && $vipStatus['level'] > 0) {
            $field = 'referralRebateRatioVip' . $vipStatus['level'];
            if (isset($options->$field) && (float)$options->$field > 0) {
                return (float)$options->$field;
            }
        }
    }

    return isset($options->referralRebateRatio) ? (float)$options->referralRebateRatio : 5;
}

function Mirai_referralCalcRebate($referrerUid, $orderType, $effectiveAmount) {
    $ratio = Mirai_referralGetRebateRatio($referrerUid, $orderType);
    if ($ratio <= 0) return 0;
    return round($effectiveAmount * $ratio / 100, 2);
}

function Mirai_referralGetUserRebateData($referrerUid, $status = 'all') {
    $db = \Typecho\Db::get();
    $orderTable = Mirai_pointsTable('mirai_pay_orders');

    $select = $db->select(['COUNT(*)' => 'cnt', 'SUM(rebate_price)' => 'total'])->from($orderTable)
        ->where('referrer_uid = ?', $referrerUid);

    if ($status === 'effective') {
        $select = $select->where('rebate_status = ?', 0);
    } elseif ($status === 'withdrawn') {
        $select = $select->where('rebate_status = ?', 1);
    }

    $row = $db->fetchRow($select);
    return [
        'count' => (int)($row['cnt'] ?? 0),
        'total' => (float)($row['total'] ?? 0),
    ];
}
