<?php
// ============================================
// API مدیریت سرویس‌های مرزبان
// ============================================

header('Content-Type: application/json');
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: GET, POST, PUT, DELETE');
header('Access-Control-Allow-Headers: Content-Type, Authorization');

require_once 'config.php';
require_once 'request.php';

date_default_timezone_set('Asia/Tehran');

// ============================================
// توابع اصلی API
// ============================================

/**
 * دریافت اطلاعات کاربر
 * GET /api.php?action=get_user&username=USERNAME
 */
function get_user($username) {
    $panel = select("marzban_panel", "*", "name_panel", "default", "select");
    if (!$panel) {
        return ['error' => true, 'message' => 'پنل یافت نشد'];
    }
    
    $Check_token = token_panel($panel['code_panel']);
    if (!empty($Check_token['error'])) {
        return ['error' => true, 'message' => $Check_token['error']];
    }
    
    $url = $panel['url_panel'] . '/api/user/' . $username;
    $req = new CurlRequest($url);
    $req->setHeaders(['accept: application/json']);
    $req->setBearerToken($Check_token['access_token']);
    $response = $req->get();
    
    if (isset($response['error'])) {
        return ['error' => true, 'message' => 'کاربر یافت نشد'];
    }
    
    $user_data = json_decode($response['body'], true);
    
    return [
        'error' => false,
        'data' => [
            'username' => $user_data['username'],
            'status' => $user_data['status'],
            'data_limit' => $user_data['data_limit'],
            'data_limit_reset_strategy' => $user_data['data_limit_reset_strategy'],
            'used_traffic' => $user_data['used_traffic'],
            'expire' => $user_data['expire'],
            'expire_date' => $user_data['expire'] > 0 ? date('Y-m-d H:i:s', $user_data['expire']) : 'نامحدود',
            'created_at' => $user_data['created_at'],
            'subscription_url' => $user_data['subscription_url'] ?? $panel['url_panel'] . '/sub/' . $username
        ]
    ];
}

/**
 * تمدید سرویس + ریست حجم مصرفی + اعمال حجم جدید
 * POST /api.php?action=renew
 * Body: username=USERNAME&extra_days=30&new_data_limit=10
 */
function renew_service() {
    $input = json_decode(file_get_contents('php://input'), true);
    if (!$input) $input = $_POST;
    
    $username = $input['username'] ?? '';
    $extra_days = (int)($input['extra_days'] ?? 0);
    $new_data_limit_gb = (int)($input['new_data_limit'] ?? 0);
    
    if (empty($username)) {
        return ['error' => true, 'message' => 'نام کاربری الزامی است'];
    }
    
    if ($extra_days <= 0 && $new_data_limit_gb <= 0) {
        return ['error' => true, 'message' => 'حداقل یکی از فیلدهای extra_days یا new_data_limit باید مقدار داشته باشد'];
    }
    
    $panel = select("marzban_panel", "*", "name_panel", "default", "select");
    if (!$panel) {
        return ['error' => true, 'message' => 'پنل یافت نشد'];
    }
    
    $Check_token = token_panel($panel['code_panel']);
    if (!empty($Check_token['error'])) {
        return ['error' => true, 'message' => $Check_token['error']];
    }
    
    // دریافت اطلاعات فعلی کاربر
    $url = $panel['url_panel'] . '/api/user/' . $username;
    $req = new CurlRequest($url);
    $req->setHeaders(['accept: application/json']);
    $req->setBearerToken($Check_token['access_token']);
    $response = $req->get();
    
    if (isset($response['error'])) {
        return ['error' => true, 'message' => 'کاربر یافت نشد'];
    }
    
    $current_user = json_decode($response['body'], true);
    
    // محاسبه زمان جدید
    $current_expire = $current_user['expire'];
    if ($extra_days > 0) {
        if ($current_expire == 0 || $current_expire < time()) {
            $new_expire = time() + ($extra_days * 86400);
        } else {
            $new_expire = $current_expire + ($extra_days * 86400);
        }
    } else {
        $new_expire = $current_expire;
    }
    
    // محاسبه حجم جدید
    if ($new_data_limit_gb > 0) {
        $new_data_limit_bytes = $new_data_limit_gb * 1024 * 1024 * 1024;
    } else {
        $new_data_limit_bytes = $current_user['data_limit'];
    }
    
    // ساخت دیتا برای بروزرسانی
    $update_data = [
        'expire' => $new_expire,
        'data_limit' => $new_data_limit_bytes,
        'used_traffic' => 0  // ریست حجم مصرفی
    ];
    
    // بروزرسانی کاربر
    $url = $panel['url_panel'] . '/api/user/' . $username;
    $req = new CurlRequest($url);
    $req->setHeaders(['accept: application/json', 'Content-Type: application/json']);
    $req->setBearerToken($Check_token['access_token']);
    $response = $req->put(json_encode($update_data));
    
    if (isset($response['error'])) {
        return ['error' => true, 'message' => 'خطا در تمدید سرویس'];
    }
    
    return [
        'error' => false,
        'message' => 'سرویس با موفقیت تمدید شد',
        'data' => [
            'username' => $username,
            'new_expire' => date('Y-m-d H:i:s', $new_expire),
            'new_data_limit' => $new_data_limit_gb . ' GB',
            'used_traffic_reset' => true
        ]
    ];
}

/**
 * افزایش حجم سرویس (بدون ریست)
 * POST /api.php?action=add_volume
 * Body: username=USERNAME&extra_gb=5
 */
function add_volume() {
    $input = json_decode(file_get_contents('php://input'), true);
    if (!$input) $input = $_POST;
    
    $username = $input['username'] ?? '';
    $extra_gb = (int)($input['extra_gb'] ?? 0);
    
    if (empty($username)) {
        return ['error' => true, 'message' => 'نام کاربری الزامی است'];
    }
    
    if ($extra_gb <= 0) {
        return ['error' => true, 'message' => 'مقدار حجم باید بیشتر از صفر باشد'];
    }
    
    $panel = select("marzban_panel", "*", "name_panel", "default", "select");
    if (!$panel) {
        return ['error' => true, 'message' => 'پنل یافت نشد'];
    }
    
    $Check_token = token_panel($panel['code_panel']);
    if (!empty($Check_token['error'])) {
        return ['error' => true, 'message' => $Check_token['error']];
    }
    
    // دریافت اطلاعات فعلی کاربر
    $url = $panel['url_panel'] . '/api/user/' . $username;
    $req = new CurlRequest($url);
    $req->setHeaders(['accept: application/json']);
    $req->setBearerToken($Check_token['access_token']);
    $response = $req->get();
    
    if (isset($response['error'])) {
        return ['error' => true, 'message' => 'کاربر یافت نشد'];
    }
    
    $current_user = json_decode($response['body'], true);
    
    // محاسبه حجم جدید
    $current_limit = $current_user['data_limit'];
    $extra_bytes = $extra_gb * 1024 * 1024 * 1024;
    
    if ($current_limit == 0) {
        $new_limit = $extra_bytes;
    } else {
        $new_limit = $current_limit + $extra_bytes;
    }
    
    // بروزرسانی حجم
    $update_data = ['data_limit' => $new_limit];
    
    $url = $panel['url_panel'] . '/api/user/' . $username;
    $req = new CurlRequest($url);
    $req->setHeaders(['accept: application/json', 'Content-Type: application/json']);
    $req->setBearerToken($Check_token['access_token']);
    $response = $req->put(json_encode($update_data));
    
    if (isset($response['error'])) {
        return ['error' => true, 'message' => 'خطا در افزایش حجم'];
    }
    
    return [
        'error' => false,
        'message' => 'حجم سرویس با موفقیت افزایش یافت',
        'data' => [
            'username' => $username,
            'added_volume' => $extra_gb . ' GB',
            'new_total_volume' => $new_limit > 0 ? ($new_limit / (1024*1024*1024)) . ' GB' : 'نامحدود'
        ]
    ];
}

/**
 * حذف سرویس
 * DELETE /api.php?action=delete&username=USERNAME
 */
function delete_service() {
    $username = $_GET['username'] ?? '';
    
    if (empty($username)) {
        return ['error' => true, 'message' => 'نام کاربری الزامی است'];
    }
    
    $panel = select("marzban_panel", "*", "name_panel", "default", "select");
    if (!$panel) {
        return ['error' => true, 'message' => 'پنل یافت نشد'];
    }
    
    $Check_token = token_panel($panel['code_panel']);
    if (!empty($Check_token['error'])) {
        return ['error' => true, 'message' => $Check_token['error']];
    }
    
    $url = $panel['url_panel'] . '/api/user/' . $username;
    $req = new CurlRequest($url);
    $req->setHeaders(['accept: application/json']);
    $req->setBearerToken($Check_token['access_token']);
    $response = $req->delete();
    
    if (isset($response['error'])) {
        return ['error' => true, 'message' => 'خطا در حذف سرویس'];
    }
    
    return [
        'error' => false,
        'message' => 'سرویس با موفقیت حذف شد',
        'data' => ['username' => $username]
    ];
}

/**
 * خاموش/روشن کردن سرویس
 * POST /api.php?action=toggle_status
 * Body: username=USERNAME&status=active/disabled
 */
function toggle_status() {
    $input = json_decode(file_get_contents('php://input'), true);
    if (!$input) $input = $_POST;
    
    $username = $input['username'] ?? '';
    $status = $input['status'] ?? '';
    
    if (empty($username)) {
        return ['error' => true, 'message' => 'نام کاربری الزامی است'];
    }
    
    if (!in_array($status, ['active', 'disabled'])) {
        return ['error' => true, 'message' => 'وضعیت باید active یا disabled باشد'];
    }
    
    $panel = select("marzban_panel", "*", "name_panel", "default", "select");
    if (!$panel) {
        return ['error' => true, 'message' => 'پنل یافت نشد'];
    }
    
    $Check_token = token_panel($panel['code_panel']);
    if (!empty($Check_token['error'])) {
        return ['error' => true, 'message' => $Check_token['error']];
    }
    
    $update_data = ['status' => $status];
    
    $url = $panel['url_panel'] . '/api/user/' . $username;
    $req = new CurlRequest($url);
    $req->setHeaders(['accept: application/json', 'Content-Type: application/json']);
    $req->setBearerToken($Check_token['access_token']);
    $response = $req->put(json_encode($update_data));
    
    if (isset($response['error'])) {
        return ['error' => true, 'message' => 'خطا در تغییر وضعیت'];
    }
    
    $status_text = $status == 'active' ? 'فعال' : 'غیرفعال';
    
    return [
        'error' => false,
        'message' => "سرویس با موفقیت {$status_text} شد",
        'data' => [
            'username' => $username,
            'status' => $status
        ]
    ];
}

/**
 * دریافت لیست اینباندها
 * GET /api.php?action=get_inbounds
 */
function get_inbounds() {
    $panel = select("marzban_panel", "*", "name_panel", "default", "select");
    if (!$panel) {
        return ['error' => true, 'message' => 'پنل یافت نشد'];
    }
    
    $Check_token = token_panel($panel['code_panel']);
    if (!empty($Check_token['error'])) {
        return ['error' => true, 'message' => $Check_token['error']];
    }
    
    $url = $panel['url_panel'] . '/api/inbounds';
    $req = new CurlRequest($url);
    $req->setHeaders(['accept: application/json']);
    $req->setBearerToken($Check_token['access_token']);
    $response = $req->get();
    
    if (isset($response['error'])) {
        return ['error' => true, 'message' => 'خطا در دریافت اینباندها'];
    }
    
    $inbounds = json_decode($response['body'], true);
    
    // فرمت کردن خروجی
    $formatted_inbounds = [];
    foreach ($inbounds as $protocol => $items) {
        foreach ($items as $item) {
            $formatted_inbounds[] = [
                'tag' => $item['tag'],
                'protocol' => $protocol,
                'network' => $item['network'],
                'port' => $item['port'],
                'tls' => $item['tls']
            ];
        }
    }
    
    return [
        'error' => false,
        'data' => [
            'total' => count($formatted_inbounds),
            'inbounds' => $formatted_inbounds
        ]
    ];
}

// ============================================
// روتینگ API
// ============================================

$action = $_GET['action'] ?? $_POST['action'] ?? '';

switch ($action) {
    case 'get_user':
        $username = $_GET['username'] ?? '';
        if (empty($username)) {
            echo json_encode(['error' => true, 'message' => 'نام کاربری الزامی است']);
        } else {
            echo json_encode(get_user($username));
        }
        break;
        
    case 'renew':
        echo json_encode(renew_service());
        break;
        
    case 'add_volume':
        echo json_encode(add_volume());
        break;
        
    case 'delete':
        echo json_encode(delete_service());
        break;
        
    case 'toggle_status':
        echo json_encode(toggle_status());
        break;
        
    case 'get_inbounds':
        echo json_encode(get_inbounds());
        break;
        
    default:
        echo json_encode([
            'error' => true,
            'message' => 'اکشن نامعتبر',
            'available_actions' => [
                'get_user' => 'GET - دریافت اطلاعات کاربر (username=NAME)',
                'renew' => 'POST - تمدید سرویس (username, extra_days, new_data_limit)',
                'add_volume' => 'POST - افزایش حجم (username, extra_gb)',
                'delete' => 'DELETE - حذف سرویس (username=NAME)',
                'toggle_status' => 'POST - تغییر وضعیت (username, status=active/disabled)',
                'get_inbounds' => 'GET - دریافت لیست اینباندها'
            ]
        ]);
        break;
}
?>