<?php
/**
 * موتور قیمت‌گذاری لحظه‌ای خدمات مجازی (Premium / Stars / Gift)
 * ---------------------------------------------------------------
 * این فایل معادل PHP بخشِ «محاسبه‌ی قیمت پایه بر اساس USD Peg» از
 * سورس price.py است. چون در NAVIRA همه‌چیز به «تومان» نمایش داده
 * می‌شود (نه TON)، مرحله‌ی تبدیل به TON که در price.py بود حذف و
 * به‌جایش تبدیل مستقیم دلار → تومان انجام شده.
 *
 * ⚠️ نکته‌ی مهم درباره‌ی سورس price.py:
 * کلید API سرویس swapwallet.app که داخل price.py هاردکد شده بود
 * (با کامنت «دست نزنید») یک کلید خصوصیِ متعلق به شخص/سرویس دیگری
 * است و اصلا هم مخصوص Fragment نیست (فقط نرخ TON/USDT عمومی می‌داد).
 * استفاده از کلید API خصوصیِ یک نفر دیگر در ربات شما بدون اجازه‌اش
 * درست نیست، برای همین اینجا بازتولید/استفاده نشده.
 *
 * به‌جایش یک موتور نرخ دلار ماژولار ساخته شده:
 *   ۱) اگر در پنل ادمین یک API نرخ دلار (متعلق به خودتان) ثبت کنید،
 *      از همان استفاده می‌شود («📡 آدرس API نرخ دلار»).
 *   ۲) در غیر این‌صورت از «نرخ دستی» که در پنل ادمین ثبت می‌کنید
 *      استفاده می‌شود — دقیقا مثل خیلی از ربات‌های ایرانی که نرخ
 *      دلار را دستی/روزانه به‌روزرسانی می‌کنند.
 *   ۳) نتیجه چند دقیقه کش می‌شود تا هم سریع باشد هم فشار زیاد به API
 *      وارد نشود؛ اگر API لحظه‌ای در دسترس نبود، از آخرین مقدار کش
 *      (حتی منقضی‌شده) و در نهایت از نرخ دستی استفاده می‌شود.
 *
 * قیمت‌های پایه‌ی دلاریِ Premium/Stars هم از همان اعداد مرجعی که در
 * price.py ثابت بودند گرفته شده (Premium 3/6/12: 11.99/15.99/28.99 $ ،
 * هر Star: 0.015 $) و از پنل ادمین («💰 تنظیم قیمت پایه») قابل ویرایش‌اند.
 */

#-----------------[ نرخ دلار به تومان (کش‌شده + قابل تنظیم) ]-------------------#
function vsGetUsdIrtRate()
{
    $ttl       = intval(vsSetting('vs_rate_cache_ttl', 120));
    $cachedAt  = intval(vsSetting('vs_rate_cache_time', 0));
    $cachedVal = floatval(vsSetting('vs_rate_cache_value', 0));

    if ($cachedVal > 0 && (time() - $cachedAt) < $ttl) {
        return $cachedVal;
    }

    $fresh = vsFetchUsdIrtRateFromApi();
    if ($fresh !== null && $fresh > 0) {
        vsSetSetting('vs_rate_cache_value', (string) $fresh);
        vsSetSetting('vs_rate_cache_time', (string) time());
        return $fresh;
    }

    // API در دسترس نبود یا تنظیم نشده: از آخرین مقدار کش (حتی منقضی) استفاده کن
    if ($cachedVal > 0) {
        return $cachedVal;
    }

    // در نهایت از نرخ دستیِ ثبت‌شده توسط ادمین استفاده کن
    return floatval(vsSetting('vs_usd_manual_rate', 0));
}

function vsFetchUsdIrtRateFromApi()
{
    $url = trim((string) vsSetting('vs_rate_api_url', ''));
    if ($url === '') return null;

    $apiKey    = trim((string) vsSetting('vs_rate_api_key', ''));
    $headerName = trim((string) vsSetting('vs_rate_api_header', 'x-api-key'));

    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_TIMEOUT, 6);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 4);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
    if ($apiKey !== '' && $headerName !== '') {
        curl_setopt($ch, CURLOPT_HTTPHEADER, [$headerName . ': ' . $apiKey, 'Accept: application/json']);
    }
    $raw = curl_exec($ch);
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);

    if ($raw === false || $httpCode !== 200) return null;

    $data = json_decode($raw, true);
    if (!is_array($data)) return null;

    // مسیر کلید JSON که مقدار نرخ داخلش است، مثلا "usd" یا "result.usd_sell"
    $path  = trim((string) vsSetting('vs_rate_json_key', 'usd'));
    $value = vsExtractByDotPath($data, $path);
    if (is_string($value)) {
        $value = preg_replace('/[^0-9.]/', '', $value);
    }
    $value = floatval($value);
    return $value > 0 ? $value : null;
}

function vsExtractByDotPath($arr, $path)
{
    $cur = $arr;
    foreach (explode('.', $path) as $k) {
        if (is_array($cur) && array_key_exists($k, $cur)) {
            $cur = $cur[$k];
        } else {
            return null;
        }
    }
    return $cur;
}

#-----------------[ قیمت دقیق، بدون گرد کردن به نزدیک‌ترین رقم ]-------------------#
// طبق درخواست: قیمت نهایی همان مقدار دقیق محاسبه‌شده است (فقط به نزدیک‌ترین
// تومان صحیح رند می‌شود چون واحد پول کسری ندارد؛ گرد کردن به ۱۰۰۰/۱۰۰۰۰ و
// غیره حذف شده).
function vsRoundPrice($toman)
{
    return (int) round($toman);
}

#-----------------[ اعمال درصد سود روی قیمت پایه ]-------------------#
function vsApplyProfit($baseToman, $profitPercent)
{
    return $baseToman * (1 + (floatval($profitPercent) / 100));
}

#-----------------[ قیمت‌های پایه‌ی دلاری (قابل ویرایش از پنل) ]-------------------#
function vsBaseUsdPremium($months)
{
    return floatval(vsSetting('vs_base_usd_premium_' . intval($months), 0));
}

function vsBaseUsdPerStar()
{
    return floatval(vsSetting('vs_base_usd_star', 0.015));
}

/**
 * وقتی نرخ دلار یا قیمت پایه تنظیم نشده باشد null برمی‌گرداند تا
 * صفحات مربوطه به‌جای نمایش قیمتِ صفر/غلط، پیام خطای مناسب نشان دهند.
 */
#-----------------[ محاسبه‌ی قیمت نهایی: Premium ]-------------------#
function vsPriceForPremium($months)
{
    $rate    = vsGetUsdIrtRate();
    $baseUsd = vsBaseUsdPremium($months);
    if ($rate <= 0 || $baseUsd <= 0) return null;

    $baseToman = $baseUsd * $rate;
    $profit    = floatval(vsSetting('vs_profit_premium', 10));
    return vsRoundPrice(vsApplyProfit($baseToman, $profit));
}

#-----------------[ محاسبه‌ی قیمت نهایی: Stars ]-------------------#
function vsPriceForStars($qty)
{
    $rate       = vsGetUsdIrtRate();
    $perStarUsd = vsBaseUsdPerStar();
    if ($rate <= 0 || $perStarUsd <= 0) return null;

    $baseToman = max(0, intval($qty)) * $perStarUsd * $rate;
    $profit    = floatval(vsSetting('vs_profit_stars', 10));
    return vsRoundPrice(vsApplyProfit($baseToman, $profit));
}

#-----------------[ محاسبه‌ی قیمت نهایی: Gift ]-------------------#
// فرمول عمومی برای همه‌ی گیفت‌ها (فعلی و آینده): تعداد استارز گیفت × قیمت
// لحظه‌ای هر استارز = قیمت پایه؛ سپس درصد سود گروه Gift روی آن اعمال می‌شود.
// نیازی به فرمول جداگانه برای هر گیفت نیست؛ فقط کافیست هنگام افزودن گیفت
// جدید تعداد استارزش مشخص شود.
function vsPriceForGift($gift)
{
    if (isset($gift['stars']) && intval($gift['stars']) > 0) {
        $rate       = vsGetUsdIrtRate();
        $perStarUsd = vsBaseUsdPerStar();
        if ($rate <= 0 || $perStarUsd <= 0) return null;

        $baseToman = intval($gift['stars']) * $perStarUsd * $rate;
        $profit    = floatval(vsSetting('vs_profit_gift', 10));
        return vsRoundPrice(vsApplyProfit($baseToman, $profit));
    }

    // سازگاری با گیفت‌های قدیمی‌ای که فقط قیمت ثابت تومانی داشتند (بدون stars)
    return isset($gift['price']) ? intval($gift['price']) : null;
}

#-----------------[ ابزار عیب‌یابی: تست دستیِ فراخوانی API نرخ دلار ]-------------------#
// این تابع همان vsFetchUsdIrtRateFromApi را با جزئیات کامل (کد HTTP، خطای
// curl، تکه‌ای از پاسخ خام و مقدار استخراج‌شده) برمی‌گرداند تا وقتی چیزی کار
// نکرد، ادمین دقیقاً بفهمد مشکل از کجاست (کلید غلط، هدر غلط، مسیر JSON غلط،
// یا مسدود بودن اتصال از سمت هاست).
function vsDebugUsdRateFetch()
{
    $url = trim((string) vsSetting('vs_rate_api_url', ''));
    $result = [
        'url' => $url,
        'has_key' => trim((string) vsSetting('vs_rate_api_key', '')) !== '',
        'header_name' => trim((string) vsSetting('vs_rate_api_header', 'x-api-key')),
        'json_path' => trim((string) vsSetting('vs_rate_json_key', '')),
        'curl_available' => function_exists('curl_init'),
        'http_code' => null,
        'curl_error' => null,
        'raw_snippet' => null,
        'extracted_value' => null,
        'final_rate' => null,
    ];

    if ($url === '') {
        $result['curl_error'] = 'آدرس API خالی است.';
        return $result;
    }
    if (!$result['curl_available']) {
        $result['curl_error'] = 'اکستنشن curl روی این هاست فعال نیست (php-curl نصب نیست).';
        return $result;
    }

    $apiKey    = trim((string) vsSetting('vs_rate_api_key', ''));
    $headerName = $result['header_name'];

    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_TIMEOUT, 8);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
    if ($apiKey !== '' && $headerName !== '') {
        curl_setopt($ch, CURLOPT_HTTPHEADER, [$headerName . ': ' . $apiKey, 'Accept: application/json']);
    }
    $raw = curl_exec($ch);
    $result['http_code'] = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    $result['curl_error'] = curl_error($ch) ?: null;
    curl_close($ch);

    if ($raw !== false) {
        $result['raw_snippet'] = substr($raw, 0, 300);
        $data = json_decode($raw, true);
        if (is_array($data)) {
            $val = vsExtractByDotPath($data, $result['json_path']);
            $result['extracted_value'] = $val;
        } else {
            $result['curl_error'] = ($result['curl_error'] ? $result['curl_error'] . ' | ' : '') . 'پاسخ JSON معتبر نیست.';
        }
    }

    $result['final_rate'] = vsGetUsdIrtRate();
    return $result;
}

#-----------------[ متن استاندارد خطا وقتی نرخ/قیمت پایه تنظیم نشده ]-------------------#
function vsPriceUnavailableText()
{
    // این خطا (نرخ دلار/قیمت پایه تنظیم نشده) به تاپیک «⚠️ خطاهای خدمات مجازی» در
    // گروه گزارشات ادمین هم اطلاع داده می‌شود؛ برای جلوگیری از اسپم در صورت کلیک‌های
    // پیاپی کاربران، حداکثر هر ۵ دقیقه یک‌بار ارسال می‌شود.
    if (function_exists('vsSendGroupError')) {
        $lastReport = intval(vsSetting('vs_last_price_error_report_time', 0));
        if ((time() - $lastReport) > 300) {
            vsSetSetting('vs_last_price_error_report_time', (string) time());
            vsSendGroupError("⚠️ <b>خطای قیمت‌گذاری خدمات مجازی</b>\n\nنرخ دلار یا قیمت پایه تنظیم نشده و کاربران نمی‌توانند Stars/Premium/Gift خریداری کنند.\nلطفاً از «🎛 پنل خدمات مجازی → 📈 سود و نرخ دلار» بررسی و تنظیم کنید.");
        }
    }
    return "⚠️ در حال حاضر امکان محاسبه‌ی قیمت لحظه‌ای وجود ندارد.\nاین بخش نیاز به تنظیم «نرخ دلار» توسط ادمین دارد. لطفاً بعداً تلاش کنید.";
}