<?php
/**
 * اسکریپت رفع مشکلات دیتابیس
 * این فایل را یکبار اجرا کنید تا فیلدهای مورد نیاز اضافه شوند
 */

require_once 'config.php';

echo "<!DOCTYPE html>
<html lang='fa' dir='rtl'>
<head>
    <meta charset='UTF-8'>
    <meta name='viewport' content='width=device-width, initial-scale=1.0'>
    <title>رفع مشکلات دیتابیس</title>
    <link href='https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css' rel='stylesheet'>
</head>
<body>
    <div class='container mt-5'>
        <div class='card'>
            <div class='card-header bg-primary text-white'>
                <h4>رفع مشکلات دیتابیس</h4>
            </div>
            <div class='card-body'>";

try {
    // بررسی و افزودن فیلد last_activity
    echo "<h5>1. بررسی فیلد last_activity</h5>";
    $check = $pdo->query("SHOW COLUMNS FROM representatives LIKE 'last_activity'");
    if ($check->rowCount() > 0) {
        echo "<div class='alert alert-success'>✓ فیلد last_activity موجود است</div>";
    } else {
        echo "<div class='alert alert-warning'>✗ فیلد last_activity موجود نیست - در حال افزودن...</div>";
        try {
            $pdo->exec("ALTER TABLE `representatives` ADD COLUMN `last_activity` datetime DEFAULT NULL COMMENT 'آخرین زمان فعالیت نماینده' AFTER `expiry_date`");
            echo "<div class='alert alert-success'>✓ فیلد last_activity با موفقیت افزوده شد</div>";
        } catch (Exception $e) {
            echo "<div class='alert alert-danger'>✗ خطا در افزودن فیلد: " . htmlspecialchars($e->getMessage()) . "</div>";
        }
    }
    
    // بررسی و افزودن فیلدهای proxy
    echo "<h5 class='mt-4'>2. بررسی فیلدهای proxy در جدول panels</h5>";
    $proxy_fields = ['proxy_type', 'proxy_host', 'proxy_port', 'proxy_username', 'proxy_password', 'use_proxy'];
    foreach ($proxy_fields as $field) {
        $check = $pdo->query("SHOW COLUMNS FROM panels LIKE '$field'");
        if ($check->rowCount() > 0) {
            echo "<div class='alert alert-success'>✓ فیلد panels.$field موجود است</div>";
        } else {
            echo "<div class='alert alert-warning'>✗ فیلد panels.$field موجود نیست - در حال افزودن...</div>";
            try {
                $sql = "ALTER TABLE `panels` ADD COLUMN `$field` ";
                switch ($field) {
                    case 'proxy_type':
                        $sql .= "varchar(20) DEFAULT NULL COMMENT 'نوع proxy: socks5'";
                        break;
                    case 'proxy_host':
                        $sql .= "varchar(255) DEFAULT NULL COMMENT 'آدرس proxy'";
                        break;
                    case 'proxy_port':
                        $sql .= "int(11) DEFAULT NULL COMMENT 'پورت proxy'";
                        break;
                    case 'proxy_username':
                        $sql .= "varchar(255) DEFAULT NULL COMMENT 'نام کاربری proxy'";
                        break;
                    case 'proxy_password':
                        $sql .= "varchar(255) DEFAULT NULL COMMENT 'رمز عبور proxy'";
                        break;
                    case 'use_proxy':
                        $sql .= "tinyint(1) DEFAULT 0 COMMENT 'استفاده از proxy در صورت خطا'";
                        break;
                }
                $pdo->exec($sql);
                echo "<div class='alert alert-success'>✓ فیلد panels.$field با موفقیت افزوده شد</div>";
            } catch (Exception $e) {
                echo "<div class='alert alert-danger'>✗ خطا در افزودن فیلد: " . htmlspecialchars($e->getMessage()) . "</div>";
            }
        }
    }
    
    // کیف پول نمایندگان
    echo "<h5 class='mt-4'>3. کیف پول نمایندگان</h5>";
    $check = $pdo->query("SHOW COLUMNS FROM representatives LIKE 'wallet_balance'");
    if ($check->rowCount() > 0) {
        echo "<div class='alert alert-success'>✓ فیلد representatives.wallet_balance موجود است</div>";
    } else {
        try {
            $pdo->exec("ALTER TABLE `representatives` ADD COLUMN `wallet_balance` DECIMAL(12,2) NOT NULL DEFAULT 0.00 COMMENT 'موجودی کیف پول' AFTER `last_activity`");
            echo "<div class='alert alert-success'>✓ فیلد wallet_balance افزوده شد</div>";
        } catch (Exception $e) {
            echo "<div class='alert alert-danger'>✗ خطا: " . htmlspecialchars($e->getMessage()) . "</div>";
        }
    }
    try {
        $pdo->exec("CREATE TABLE IF NOT EXISTS `wallet_transactions` (
          `id` int(11) NOT NULL AUTO_INCREMENT,
          `representative_id` int(11) NOT NULL,
          `amount` DECIMAL(12,2) NOT NULL,
          `type` varchar(50) NOT NULL DEFAULT 'create_user',
          `ref_id` int(11) DEFAULT NULL,
          `description` varchar(255) DEFAULT NULL,
          `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
          PRIMARY KEY (`id`),
          KEY `representative_id` (`representative_id`),
          KEY `created_at` (`created_at`)
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci");
        echo "<div class='alert alert-success'>✓ جدول wallet_transactions موجود است</div>";
    } catch (Exception $e) {
        echo "<div class='alert alert-danger'>✗ خطا در جدول تراکنش‌ها: " . htmlspecialchars($e->getMessage()) . "</div>";
    }
    
    // محدودیت هر اینباند برای نماینده
    $check = $pdo->query("SHOW COLUMNS FROM representative_inbounds LIKE 'user_limit'");
    if ($check->rowCount() > 0) {
        echo "<div class='alert alert-success'>✓ فیلد representative_inbounds.user_limit موجود است</div>";
    } else {
        try {
            $pdo->exec("ALTER TABLE `representative_inbounds` ADD COLUMN `user_limit` int(11) NOT NULL DEFAULT 0 COMMENT 'حداکثر کاربر برای این اینباند، 0=نامحدود' AFTER `inbound_name`");
            echo "<div class='alert alert-success'>✓ فیلد user_limit افزوده شد</div>";
        } catch (Exception $e) {
            echo "<div class='alert alert-danger'>✗ خطا: " . htmlspecialchars($e->getMessage()) . "</div>";
        }
    }
    
    // تیکت و اعلانات
    echo "<h5 class='mt-4'>4. تیکت و اعلانات</h5>";
    try {
        $pdo->exec("CREATE TABLE IF NOT EXISTS `tickets` (
          `id` int(11) NOT NULL AUTO_INCREMENT,
          `representative_id` int(11) NOT NULL,
          `subject` varchar(255) NOT NULL,
          `status` varchar(20) NOT NULL DEFAULT 'open',
          `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
          `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
          PRIMARY KEY (`id`),
          KEY `representative_id` (`representative_id`),
          KEY `status` (`status`)
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci");
        $pdo->exec("CREATE TABLE IF NOT EXISTS `ticket_messages` (
          `id` int(11) NOT NULL AUTO_INCREMENT,
          `ticket_id` int(11) NOT NULL,
          `sender_type` varchar(20) NOT NULL,
          `sender_id` int(11) DEFAULT NULL,
          `message` text NOT NULL,
          `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
          PRIMARY KEY (`id`),
          KEY `ticket_id` (`ticket_id`)
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci");
        $pdo->exec("CREATE TABLE IF NOT EXISTS `announcements` (
          `id` int(11) NOT NULL AUTO_INCREMENT,
          `title` varchar(255) NOT NULL,
          `content` text NOT NULL,
          `type` varchar(30) NOT NULL DEFAULT 'message',
          `active` tinyint(1) NOT NULL DEFAULT 1,
          `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
          `expires_at` datetime DEFAULT NULL,
          PRIMARY KEY (`id`),
          KEY `active` (`active`)
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci");
        echo "<div class='alert alert-success'>✓ جداول تیکت و اعلانات موجود است</div>";
    } catch (Exception $e) {
        echo "<div class='alert alert-danger'>✗ خطا: " . htmlspecialchars($e->getMessage()) . "</div>";
    }
    
    // محدودیت هر اینباند در سطح پنل
    echo "<h5 class='mt-4'>5. محدودیت اینباند هر پنل</h5>";
    try {
        $pdo->exec("CREATE TABLE IF NOT EXISTS `panel_inbounds` (
          `id` int(11) NOT NULL AUTO_INCREMENT,
          `panel_id` int(11) NOT NULL,
          `inbound_id` int(11) NOT NULL COMMENT 'ID اینباند در پنل 3x-ui',
          `user_limit` int(11) NOT NULL DEFAULT 0 COMMENT 'حداکثر کاربر کل روی این اینباند، 0=نامحدود',
          `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
          PRIMARY KEY (`id`),
          UNIQUE KEY `unique_panel_inbound` (`panel_id`, `inbound_id`),
          KEY `panel_id` (`panel_id`)
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci");
        echo "<div class='alert alert-success'>✓ جدول panel_inbounds موجود است</div>";
    } catch (Exception $e) {
        echo "<div class='alert alert-danger'>✗ خطا: " . htmlspecialchars($e->getMessage()) . "</div>";
    }
    
    // جدول تنظیمات سراسری
    echo "<h5 class='mt-4'>5b. جدول تنظیمات سراسری (settings)</h5>";
    try {
        $pdo->exec("CREATE TABLE IF NOT EXISTS `settings` (
          `name` varchar(100) NOT NULL,
          `value` text,
          `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
          PRIMARY KEY (`name`)
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci");
        echo "<div class='alert alert-success'>✓ جدول settings موجود است</div>";
        foreach (['wallet_price_per_config' => '1000', 'wallet_price_per_gb' => '0', 'wallet_price_per_day' => '0', 'default_inbound_user_limit' => '0', 'default_discount_percent' => '0', 'telegram_bot_token' => ''] as $name => $val) {
            $stmt = $pdo->prepare("INSERT IGNORE INTO settings (name, value) VALUES (?, ?)");
            $stmt->execute([$name, $val]);
        }
        echo "<div class='alert alert-success'>✓ کلیدهای پیش‌فرض تنظیمات درج شدند</div>";
    } catch (Exception $e) {
        echo "<div class='alert alert-danger'>✗ خطا: " . htmlspecialchars($e->getMessage()) . "</div>";
    }
    
    // ریمارک پیش‌فرض و قیمت گیگ/روز هر نماینده
    echo "<h5 class='mt-4'>6. ریمارک و قیمت‌های نماینده</h5>";
    $rep_cols = [
        'default_remark' => ["varchar(255) DEFAULT NULL COMMENT 'ریمارک پیش‌فرض در ساخت کاربر'", 'wallet_balance'],
        'price_per_gb' => ["decimal(12,2) NOT NULL DEFAULT 0.00 COMMENT 'قیمت هر گیگ (0=حساب نشود)'", 'default_remark'],
        'price_per_day' => ["decimal(12,2) NOT NULL DEFAULT 0.00 COMMENT 'قیمت هر روز اعتبار (0=حساب نشود)'", 'price_per_gb'],
        'discount_percent' => ["tinyint(3) NOT NULL DEFAULT 0 COMMENT 'تخفیف درصدی نماینده (0-100)'", 'price_per_day']
    ];
    foreach ($rep_cols as $col => $arr) {
        list($def, $after) = $arr;
        $check = $pdo->query("SHOW COLUMNS FROM representatives LIKE '$col'");
        if ($check->rowCount() > 0) {
            echo "<div class='alert alert-success'>✓ فیلد representatives.$col موجود است</div>";
        } else {
            try {
                $pdo->exec("ALTER TABLE `representatives` ADD COLUMN `$col` $def AFTER `$after`");
                echo "<div class='alert alert-success'>✓ فیلد representatives.$col افزوده شد</div>";
            } catch (Exception $e) {
                echo "<div class='alert alert-danger'>✗ خطا: " . htmlspecialchars($e->getMessage()) . "</div>";
            }
        }
    }
    
    // کد استعلام برای کاربران (ربات تلگرام / لینک استعلام)
    echo "<h5 class='mt-4'>6b. ستون check_token در reseller_users</h5>";
    $check = $pdo->query("SHOW COLUMNS FROM reseller_users LIKE 'check_token'");
    if ($check->rowCount() > 0) {
        echo "<div class='alert alert-success'>✓ فیلد reseller_users.check_token موجود است</div>";
    } else {
        try {
            $pdo->exec("ALTER TABLE reseller_users ADD COLUMN check_token varchar(64) DEFAULT NULL COMMENT 'کد استعلام وضعیت' AFTER status");
            $pdo->exec("ALTER TABLE reseller_users ADD UNIQUE KEY check_token (check_token)");
            echo "<div class='alert alert-success'>✓ فیلد check_token افزوده شد</div>";
            $stmt = $pdo->query("SELECT id FROM reseller_users WHERE check_token IS NULL");
            while ($row = $stmt->fetch()) {
                $token = bin2hex(random_bytes(16));
                $up = $pdo->prepare("UPDATE reseller_users SET check_token = ? WHERE id = ?");
                $up->execute([$token, $row['id']]);
            }
            echo "<div class='alert alert-success'>✓ برای کاربران قبلی کد استعلام تولید شد</div>";
        } catch (Exception $e) {
            echo "<div class='alert alert-danger'>✗ خطا: " . htmlspecialchars($e->getMessage()) . "</div>";
        }
    }
    
    // sub_id برای لینک subscription در 3x-ui (ضروری برای کارکرد صحیح subscription)
    echo "<h5 class='mt-4'>6b2. ستون sub_id در reseller_users</h5>";
    $check = $pdo->query("SHOW COLUMNS FROM reseller_users LIKE 'sub_id'");
    if ($check->rowCount() > 0) {
        echo "<div class='alert alert-success'>✓ فیلد reseller_users.sub_id موجود است</div>";
    } else {
        try {
            $pdo->exec("ALTER TABLE reseller_users ADD COLUMN sub_id varchar(64) DEFAULT NULL COMMENT 'شناسه subscription کلاینت در پنل 3x-ui' AFTER xray_user_id");
            echo "<div class='alert alert-success'>✓ فیلد sub_id افزوده شد (برای کاربران جدید از این به بعد پر می‌شود)</div>";
        } catch (Exception $e) {
            echo "<div class='alert alert-danger'>✗ خطا: " . htmlspecialchars($e->getMessage()) . "</div>";
        }
    }
    
    // اینباند از سرورهای مختلف برای نماینده (panel_id در representative_inbounds)
    echo "<h5 class='mt-4'>6c. اینباند از سرورهای مختلف (panel_id در representative_inbounds)</h5>";
    $check = $pdo->query("SHOW COLUMNS FROM representative_inbounds LIKE 'panel_id'");
    if ($check->rowCount() > 0) {
        echo "<div class='alert alert-success'>✓ فیلد representative_inbounds.panel_id موجود است</div>";
    } else {
        try {
            $pdo->exec("ALTER TABLE `representative_inbounds` ADD COLUMN `panel_id` int(11) DEFAULT NULL COMMENT 'پنل این اینباند' AFTER `representative_id`");
            $pdo->exec("UPDATE representative_inbounds ri INNER JOIN representatives r ON r.id = ri.representative_id SET ri.panel_id = r.panel_id");
            $pdo->exec("ALTER TABLE `representative_inbounds` MODIFY COLUMN `panel_id` int(11) NOT NULL");
            $pdo->exec("ALTER TABLE `representative_inbounds` DROP INDEX `unique_rep_inbound`");
            $pdo->exec("ALTER TABLE `representative_inbounds` ADD UNIQUE KEY `unique_rep_panel_inbound` (`representative_id`, `panel_id`, `inbound_id`)");
            $pdo->exec("ALTER TABLE `representative_inbounds` ADD KEY `panel_id` (`panel_id`)");
            echo "<div class='alert alert-success'>✓ panel_id افزوده شد؛ هر نماینده می‌تواند اینباند از چند سرور داشته باشد</div>";
        } catch (Exception $e) {
            echo "<div class='alert alert-danger'>✗ خطا: " . htmlspecialchars($e->getMessage()) . "</div>";
        }
    }
    
    echo "<hr>";
    echo "<div class='alert alert-success'><strong>✓ بررسی کامل شد!</strong></div>";
    echo "<p><a href='admin/representatives.php' class='btn btn-primary'>بازگشت به مدیریت نمایندگان</a></p>";
    
} catch (Exception $e) {
    echo "<div class='alert alert-danger'>خطا: " . htmlspecialchars($e->getMessage()) . "</div>";
}

echo "
            </div>
        </div>
    </div>
</body>
</html>";
?>
