<?php
// شروع session قبل از هر چیز
if (session_status() === PHP_SESSION_NONE) {
    session_start();
}

require_once '../config.php';

header('Content-Type: application/json');

// بررسی لاگین
if (!isLoggedIn()) {
    echo json_encode(['success' => false, 'message' => 'دسترسی غیرمجاز']);
    exit;
}

// بررسی دسترسی نماینده
if (!isRepresentative()) {
    echo json_encode(['success' => false, 'message' => 'دسترسی غیرمجاز']);
    exit;
}

$user_id = (int)($_GET['user_id'] ?? 0);
$inbound_id = (int)($_GET['inbound_id'] ?? 0);
$client_id = $_GET['client_id'] ?? '';

if ($user_id === 0 || $inbound_id === 0) {
    echo json_encode(['success' => false, 'message' => 'پارامترهای نامعتبر: user_id=' . $user_id . ', inbound_id=' . $inbound_id]);
    exit;
}

try {
    // دریافت اطلاعات کاربر از دیتابیس (sub_id برای subscription در 3x-ui ضروری است)
    $representative_id = $_SESSION['user_id'];
    try {
        $stmt = $pdo->prepare("SELECT xray_user_id, sub_id, email FROM reseller_users WHERE id = ? AND representative_id = ?");
        $stmt->execute([$user_id, $representative_id]);
        $user_data = $stmt->fetch();
    } catch (PDOException $e) {
        if (strpos($e->getMessage(), 'sub_id') !== false) {
            $stmt = $pdo->prepare("SELECT xray_user_id, email FROM reseller_users WHERE id = ? AND representative_id = ?");
            $stmt->execute([$user_id, $representative_id]);
            $user_data = $stmt->fetch();
            if ($user_data) $user_data['sub_id'] = null;
        } else {
            throw $e;
        }
    }
    
    error_log("Fetching user data from DB: user_id=$user_id, representative_id=$representative_id, user_data=" . json_encode($user_data));
    
    if (!$user_data) {
        error_log("No user_data found for user_id=$user_id");
        echo json_encode([
            'success' => false, 
            'message' => 'کاربر یافت نشد.',
            'debug' => [
                'user_id' => $user_id,
                'inbound_id' => $inbound_id
            ]
        ]);
        exit;
    }
    
    // در 3x-ui، subscription link معمولاً با email ساخته می‌شود
    // اما اگر xray_user_id موجود باشد، می‌توانیم از آن هم استفاده کنیم
    $user_email = $user_data['email'] ?? '';
    $xray_user_id = $user_data['xray_user_id'] ?? '';
    $sub_id = trim((string)($user_data['sub_id'] ?? ''));
    
    // اگر client_id از URL آمده، از آن استفاده کن، در غیر این صورت از email استفاده کن
    if (empty($client_id)) {
        // اولویت با xray_user_id، سپس email
        $client_id = !empty($xray_user_id) ? $xray_user_id : $user_email;
        error_log("Using client_id from DB: xray_user_id=$xray_user_id, email=$user_email, final=$client_id");
    } else {
        error_log("Using client_id from URL: $client_id");
    }

    if (empty($client_id)) {
        error_log("client_id is empty after all attempts. user_id=$user_id, inbound_id=$inbound_id");
        echo json_encode([
            'success' => false, 
            'message' => 'شناسه کاربر در پنل موجود نیست. لطفاً ابتدا کاربر را در پنل ایجاد کنید.',
            'debug' => [
                'user_id' => $user_id,
                'inbound_id' => $inbound_id,
                'client_id_received' => $_GET['client_id'] ?? 'N/A',
                'user_email' => $user_email,
                'xray_user_id' => $xray_user_id
            ]
        ]);
        exit;
    }

    // دریافت اطلاعات پنل
    $panel_stmt = $pdo->prepare("SELECT p.*, u.panel_id as user_panel_id FROM panels p JOIN reseller_users u ON p.id = u.panel_id WHERE u.id = ?");
    $panel_stmt->execute([$user_id]);
    $panel = $panel_stmt->fetch();
    
    if (!$panel) {
        // Fallback to session panel_id if user not found (though user_id check is done above)
        $panel_stmt = $pdo->prepare("SELECT * FROM panels WHERE id = ?");
        $panel_stmt->execute([$_SESSION['panel_id']]);
        $panel = $panel_stmt->fetch();
    }
    
    if (!$panel) {
        throw new Exception("پنل یافت نشد");
    }
    
    $panel_id = $panel['id'];
    
    require_once __DIR__ . '/../api/XrayAPI.php';
    
    // آماده‌سازی تنظیمات proxy
    $proxy_config = null;
    if (!empty($panel['proxy_host'])) {
        $proxy_config = [
            'type' => $panel['proxy_type'] ?? 'socks5',
            'host' => $panel['proxy_host'],
            'port' => $panel['proxy_port'] ?? 1080,
            'username' => $panel['proxy_username'] ?? null,
            'password' => $panel['proxy_password'] ?? null,
            'use_on_error' => !empty($panel['use_proxy'])
        ];
    }
    
    $xrayAPI = new XrayAPI($panel['url'], $panel['username'], $panel['password'], $proxy_config, $panel['config_domain'] ?? null);
    
    // تنظیم subscription_base_url اگر موجود باشد
    if (!empty($panel['subscription_base_url'])) {
        $xrayAPI->setSubscriptionBaseUrl($panel['subscription_base_url']);
    }
    
    // ساخت لینک subscription (در 3x-ui باید از subId استفاده شود، نه inboundId)
    $subscriptionLink = null;
    try {
        error_log("Attempting to generate subscription link: inbound_id=$inbound_id, client_id=$client_id, sub_id=" . ($sub_id ?: 'N/A'));
        $subscriptionLink = $xrayAPI->getSubscriptionLink($inbound_id, $client_id, $sub_id ?: null);
        error_log("Subscription link generated successfully: $subscriptionLink");
    } catch (Exception $e) {
        error_log("Error generating subscription link: " . $e->getMessage());
        error_log("Stack trace: " . $e->getTraceAsString());
        throw new Exception("خطا در ساخت لینک subscription: " . $e->getMessage());
    }
    
    // ساخت لینک کانفیگ مستقیم
    $configLink = null;
    try {
        error_log("Attempting to generate config link: inbound_id=$inbound_id, client_id=$client_id");
        
        // دریافت تنظیمات اختصاصی اینباند (Overrides)
        $overrides = [];
        $st_ov = $pdo->prepare("SELECT address_override, port_override, host_override, path_override, sni_override FROM panel_inbounds WHERE panel_id = ? AND inbound_id = ?");
        $st_ov->execute([$panel_id, $inbound_id]);
        $ov_data = $st_ov->fetch();
        if ($ov_data) {
            $overrides = [
                'address' => $ov_data['address_override'],
                'port' => $ov_data['port_override'],
                'host' => $ov_data['host_override'],
                'path' => $ov_data['path_override'],
                'sni' => $ov_data['sni_override']
            ];
        }

        $configLink = $xrayAPI->getConfigLink($inbound_id, $client_id, $overrides);
        error_log("Config link generated successfully: " . ($configLink ? 'Yes' : 'No'));
    } catch (Exception $e) {
        error_log("Error generating config link: " . $e->getMessage());
        error_log("Stack trace: " . $e->getTraceAsString());
        // اگر خطا داشت، فقط subscription link را برگردان
    }
    
    // لاگ برای دیباگ
    error_log("Final links: user_id=$user_id, inbound_id=$inbound_id, client_id=$client_id, subscription=$subscriptionLink, config=" . ($configLink ?? 'N/A'));
    
    echo json_encode([
        'success' => true,
        'subscription_link' => $subscriptionLink,
        'config_link' => $configLink,
        'client_id' => $client_id,
        'debug' => [
            'user_id' => $user_id,
            'inbound_id' => $inbound_id,
            'client_id' => $client_id
        ]
    ]);
    
} catch (Exception $e) {
    error_log("Exception in get_subscription_link.php: " . $e->getMessage());
    error_log("Stack trace: " . $e->getTraceAsString());
    echo json_encode([
        'success' => false,
        'message' => $e->getMessage(),
        'debug' => [
            'user_id' => $user_id ?? null,
            'inbound_id' => $inbound_id ?? null,
            'client_id' => $client_id ?? null,
            'error' => $e->getMessage(),
            'file' => $e->getFile(),
            'line' => $e->getLine()
        ]
    ]);
}
?>
