<?php
require_once __DIR__ . '/config.php';

function manual_crypto_enabled_assets(): array {
    $raw = strtoupper(trim((string)getSetting('crypto_enabled_assets','USDT,TRX')));
    $raw = str_replace([' ', '،', ';', '|'], [',', ',', ',', ','], $raw);
    $parts = array_values(array_unique(array_filter(array_map('trim', explode(',', $raw)))));
    $out = [];
    foreach ($parts as $p) {
        if (in_array($p, ['USDT','TETHER','USDT_TRX','USDT_BSC'], true) && !in_array('USDT', $out, true)) $out[] = 'USDT';
        if (in_array($p, ['TRX','TRON'], true) && !in_array('TRX', $out, true)) $out[] = 'TRX';
    }
    return $out ?: ['USDT','TRX'];
}
function manual_crypto_normalize_asset(string $asset): string {
    $a = strtoupper(trim($asset));
    if (in_array($a, ['USDT','TETHER','USDT_TRX','USDT_BSC'], true)) return 'USDT';
    if (in_array($a, ['TRX','TRON'], true)) return 'TRX';
    return '';
}
function manual_crypto_asset_label(string $asset): string {
    $asset = manual_crypto_normalize_asset($asset);
    return $asset === 'TRX' ? 'ترون TRX' : 'تتر USDT';
}
function manual_crypto_settings(): array {
    return [
        'enabled' => getSetting('manual_crypto_enabled','1') === '1',
        'enabled_assets' => manual_crypto_enabled_assets(),
        'usdt_address' => trim((string)getSetting('manual_crypto_usdt_address','')),
        'trx_address' => trim((string)getSetting('manual_crypto_trx_address','')),
        'usdt_network' => trim((string)getSetting('manual_crypto_usdt_network','TRON')) ?: 'TRON',
        'trx_network' => trim((string)getSetting('manual_crypto_trx_network','TRON')) ?: 'TRON',
        'help' => trim((string)getSetting('manual_crypto_receipt_help','بعد از واریز، عکس رسید یا هش تراکنش را ارسال کنید.')),
    ];
}

function manual_crypto_http_json(string $url, int $timeout=6): ?array {
    $ch = curl_init($url);
    curl_setopt_array($ch, [CURLOPT_RETURNTRANSFER=>true, CURLOPT_TIMEOUT=>$timeout, CURLOPT_CONNECTTIMEOUT=>4, CURLOPT_SSL_VERIFYPEER=>true, CURLOPT_HTTPHEADER=>['Accept: application/json']]);
    $body = curl_exec($ch);
    $code = (int)curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);
    if ($code < 200 || $code >= 300 || !$body) return null;
    $json = json_decode($body, true);
    return is_array($json) ? $json : null;
}
function manual_crypto_rate_from_nobitex(string $symbol): ?float {
    $json = manual_crypto_http_json('https://api.nobitex.ir/v3/orderbook/' . rawurlencode($symbol));
    if (!$json) return null;
    foreach (['lastTradePrice','last','lastPrice'] as $k) {
        if (isset($json[$k]) && is_numeric($json[$k]) && (float)$json[$k] > 0) return (float)$json[$k];
    }
    if (isset($json['asks'][0][0]) && is_numeric($json['asks'][0][0]) && (float)$json['asks'][0][0] > 0) return (float)$json['asks'][0][0];
    return null;
}
function manual_crypto_quote(int $amountIrt): array {
    $amountIrt = max(0, $amountIrt);
    $usdtRate = (float)getSetting('manual_crypto_usdt_irt_rate','0');
    $trxRate = (float)getSetting('manual_crypto_trx_irt_rate','0');
    $live = false;
    // Use the exact manual rates set by admin unless live lookup is explicitly enabled.
    if (getSetting('manual_crypto_live_rates_enabled','0') === '1') {
        $u = manual_crypto_rate_from_nobitex('USDTIRT');
        $t = manual_crypto_rate_from_nobitex('TRXIRT');
        if ($u && $u > 0) { $usdtRate = $u; $live = true; }
        if ($t && $t > 0) { $trxRate = $t; $live = true; }
    }
    $res = ['amount_irt'=>$amountIrt, 'live'=>$live, 'source'=>$live?'Nobitex':'manual', 'updated_at'=>date('Y-m-d H:i:s'), 'usdt_rate_irt'=>$usdtRate, 'trx_rate_irt'=>$trxRate, 'usdt_amount'=>null, 'trx_amount'=>null];
    if ($usdtRate > 0) $res['usdt_amount'] = round($amountIrt / $usdtRate, 6);
    if ($trxRate > 0) $res['trx_amount'] = round($amountIrt / $trxRate, 6);
    return $res;
}
function manual_crypto_format_amount($value): string {
    return rtrim(rtrim(number_format((float)$value, 6, '.', ''), '0'), '.');
}
function manual_crypto_quote_text(int $amountIrt, string $asset=''): string {
    $asset = manual_crypto_normalize_asset($asset);
    $q = manual_crypto_quote($amountIrt);
    $txt = '';
    if (($asset === '' || $asset === 'USDT') && $q['usdt_amount'] !== null) {
        $txt .= "💵 مقدار دقیق قابل انتقال: `" . manual_crypto_format_amount($q['usdt_amount']) . "` USDT
";
        $txt .= "📌 نرخ تتر: `" . number_format((float)$q['usdt_rate_irt']) . " تومان`
";
    }
    if (($asset === '' || $asset === 'TRX') && $q['trx_amount'] !== null) {
        $txt .= "🔴 مقدار دقیق قابل انتقال: `" . manual_crypto_format_amount($q['trx_amount']) . "` TRX
";
        $txt .= "📌 نرخ ترون: `" . number_format((float)$q['trx_rate_irt']) . " تومان`
";
    }
    if ($txt !== '') $txt .= "📈 مبنا: " . ($q['live'] ? 'نرخ لحظه‌ای فعال' : 'نرخ دستی تنظیم‌شده توسط مدیر') . "

";
    return $txt;
}

function manual_crypto_selected_quote(int $amountIrt, string $asset): array {
    $asset = manual_crypto_normalize_asset($asset);
    $q = manual_crypto_quote($amountIrt);
    if ($asset === 'TRX') {
        return ['asset'=>'TRX','label'=>'ترون TRX','rate_irt'=>$q['trx_rate_irt'],'amount'=>$q['trx_amount'],'source'=>$q['source'],'live'=>$q['live']];
    }
    return ['asset'=>'USDT','label'=>'تتر USDT','rate_irt'=>$q['usdt_rate_irt'],'amount'=>$q['usdt_amount'],'source'=>$q['source'],'live'=>$q['live']];
}

function manual_crypto_require_enabled(): array {
    $cfg = manual_crypto_settings();
    if (!$cfg['enabled']) throw new RuntimeException('پرداخت ارز دیجیتال فعلاً غیرفعال است.');
    $ok = false;
    if (in_array('USDT', $cfg['enabled_assets'], true) && $cfg['usdt_address'] !== '') $ok = true;
    if (in_array('TRX', $cfg['enabled_assets'], true) && $cfg['trx_address'] !== '') $ok = true;
    if (!$ok) throw new RuntimeException('ارز فعال یا آدرس ولت تتر/ترون در پنل مدیریت تنظیم نشده است.');
    return $cfg;
}
function manual_crypto_text(int $amount, string $purpose='order', string $asset=''): string {
    $cfg = manual_crypto_require_enabled();
    $txt = "🪙 پرداخت دستی ارز دیجیتال\n\n";
    $txt .= "💰 مبلغ ریالی: " . money($amount) . "\n";
    $asset = manual_crypto_normalize_asset($asset);
    $txt .= manual_crypto_quote_text($amount, $asset);
    if (($asset === '' || $asset === 'USDT') && in_array('USDT', $cfg['enabled_assets'], true) && $cfg['usdt_address'] !== '') $txt .= "💵 آدرس تتر USDT ({$cfg['usdt_network']}):\n`{$cfg['usdt_address']}`\n\n";
    if (($asset === '' || $asset === 'TRX') && in_array('TRX', $cfg['enabled_assets'], true) && $cfg['trx_address'] !== '') $txt .= "🔴 آدرس ترون TRX ({$cfg['trx_network']}):\n`{$cfg['trx_address']}`\n\n";
    $txt .= "📌 {$cfg['help']}\n\n";
    $txt .= "بعد از پرداخت، عکس رسید یا هش/TxID تراکنش را ارسال کنید.";
    return $txt;
}
function manual_crypto_upload_receipt(int $userId, string $prefix='crypto'): ?string {
    if (empty($_FILES['receipt']) || $_FILES['receipt']['error'] !== UPLOAD_ERR_OK) return null;
    $uploadDir = __DIR__ . '/../uploads/';
    if (!is_dir($uploadDir)) mkdir($uploadDir, 0755, true);
    $tmp = $_FILES['receipt']['tmp_name'];
    $ext = strtolower(pathinfo($_FILES['receipt']['name'], PATHINFO_EXTENSION));
    if (!in_array($ext, ['jpg','jpeg','png','webp'], true)) throw new RuntimeException('فقط فایل تصویری jpg/png/webp مجاز است.');
    if (filesize($tmp) > 5*1024*1024) throw new RuntimeException('حجم رسید نباید بیشتر از ۵ مگابایت باشد.');
    $info = @getimagesize($tmp); if (!$info) throw new RuntimeException('فایل رسید تصویر معتبر نیست.');
    $name = $prefix . '_' . $userId . '_' . time() . '_' . bin2hex(random_bytes(4)) . '.' . $ext;
    if (!move_uploaded_file($tmp, $uploadDir . $name)) throw new RuntimeException('ذخیره رسید ناموفق بود.');
    return $name;
}
function manual_crypto_blocked_guard(int $userId): void {
    global $pdo;
    $st=$pdo->prepare("SELECT is_blocked, blocked_reason FROM users WHERE id=? LIMIT 1"); $st->execute([$userId]); $u=$st->fetch(PDO::FETCH_ASSOC);
    if ($u && (int)($u['is_blocked'] ?? 0) === 1) throw new RuntimeException('حساب شما به دلیل ارسال رسید نامعتبر مسدود شده است. برای بررسی با پشتیبانی تماس بگیرید.');
}
function manual_crypto_notify_admins(string $msg, array $buttons, ?string $fileName=null): void {
    $admins = array_filter(array_map('trim', explode(',', ADMIN_IDS)));
    $path = $fileName ? (__DIR__ . '/../uploads/' . $fileName) : null;
    foreach ($admins as $adminId) {
        if ($fileName && $path && is_file($path)) {
            tg('sendPhoto', ['chat_id'=>$adminId, 'photo'=>new CURLFile($path), 'caption'=>$msg, 'reply_markup'=>json_encode($buttons, JSON_UNESCAPED_UNICODE)]);
        } else {
            tg('sendMessage', ['chat_id'=>$adminId, 'text'=>$msg, 'reply_markup'=>json_encode($buttons, JSON_UNESCAPED_UNICODE)]);
        }
    }
}
