-- =============================================
--   دیتابیس ربات VPN
--   کاراکترست: utf8mb4
-- =============================================

CREATE DATABASE IF NOT EXISTS vpn_bot CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
USE vpn_bot;

-- =============================================
--   کاربران
-- =============================================
CREATE TABLE IF NOT EXISTS users (
    id            INT AUTO_INCREMENT PRIMARY KEY,
    telegram_id   BIGINT UNIQUE NOT NULL,
    username      VARCHAR(100),
    full_name     VARCHAR(200),
    is_banned     TINYINT(1) DEFAULT 0,
    joined_at     TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- =============================================
--   پلن‌ها (حجم + قیمت + ظرفیت)
-- =============================================
CREATE TABLE IF NOT EXISTS plans (
    id            INT AUTO_INCREMENT PRIMARY KEY,
    name          VARCHAR(100) NOT NULL,        -- مثلاً: ۳۰ گیگ
    volume_gb     INT NOT NULL,                 -- حجم به گیگابایت
    price         INT NOT NULL,                 -- قیمت به تومان
    max_users     INT NOT NULL DEFAULT 20,      -- ظرفیت
    current_users INT NOT NULL DEFAULT 0,       -- فعلاً چند نفر دارن
    connections   INT NOT NULL DEFAULT 1,       -- اتصال همزمان
    description   TEXT,
    is_active     TINYINT(1) DEFAULT 1,
    sort_order    INT DEFAULT 0,
    created_at    TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- =============================================
--   کانفیگ‌ها (لینک vless/vmess/...)
-- =============================================
CREATE TABLE IF NOT EXISTS configs (
    id            INT AUTO_INCREMENT PRIMARY KEY,
    plan_id       INT NOT NULL,
    config_text   TEXT NOT NULL,
    is_used       TINYINT(1) DEFAULT 0,         -- آیا به کسی داده شده
    created_at    TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (plan_id) REFERENCES plans(id) ON DELETE CASCADE
);

-- =============================================
--   سرویس‌های کانفیگ تست
-- =============================================
CREATE TABLE IF NOT EXISTS test_configs (
    id            INT AUTO_INCREMENT PRIMARY KEY,
    config_text   TEXT NOT NULL,
    description   VARCHAR(200),
    is_active     TINYINT(1) DEFAULT 1,
    created_at    TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- =============================================
--   سفارشات
-- =============================================
CREATE TABLE IF NOT EXISTS orders (
    id              INT AUTO_INCREMENT PRIMARY KEY,
    user_id         BIGINT NOT NULL,
    plan_id         INT NOT NULL,
    username_code   VARCHAR(50),                -- کد یوزرنیم خودکار
    amount          INT NOT NULL,               -- مبلغ نهایی (بعد تخفیف)
    original_amount INT NOT NULL,               -- مبلغ اصلی
    discount_code   VARCHAR(50),
    discount_amount INT DEFAULT 0,
    payment_proof   TEXT,                       -- file_id عکس رسید
    status          ENUM('pending','confirmed','rejected','expired') DEFAULT 'pending',
    type            ENUM('new','renew') DEFAULT 'new',
    subscription_id INT DEFAULT NULL,           -- برای تمدید
    expire_at       TIMESTAMP DEFAULT NULL,     -- انقضای تراکنش (۱ ساعت)
    admin_note      TEXT,
    created_at      TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at      TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    FOREIGN KEY (plan_id) REFERENCES plans(id)
);

-- =============================================
--   اشتراک‌های فعال کاربران
-- =============================================
CREATE TABLE IF NOT EXISTS subscriptions (
    id            INT AUTO_INCREMENT PRIMARY KEY,
    user_id       BIGINT NOT NULL,
    plan_id       INT NOT NULL,
    config_id     INT,
    username_code VARCHAR(50),
    order_id      INT,
    expire_date   DATE DEFAULT NULL,            -- NULL = نامحدود
    notified_7d   TINYINT(1) DEFAULT 0,         -- نوتیف ۷ روز مانده
    notified_3d   TINYINT(1) DEFAULT 0,         -- نوتیف ۳ روز مانده
    notified_1d   TINYINT(1) DEFAULT 0,         -- نوتیف ۱ روز مانده
    is_active     TINYINT(1) DEFAULT 1,
    created_at    TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (plan_id) REFERENCES plans(id),
    FOREIGN KEY (config_id) REFERENCES configs(id) ON DELETE SET NULL
);

-- =============================================
--   کدهای تخفیف
-- =============================================
CREATE TABLE IF NOT EXISTS discount_codes (
    id            INT AUTO_INCREMENT PRIMARY KEY,
    code          VARCHAR(50) UNIQUE NOT NULL,
    percent       INT NOT NULL,                 -- درصد تخفیف (۱ تا ۱۰۰)
    max_use       INT DEFAULT 1,
    used_count    INT DEFAULT 0,
    plan_id       INT DEFAULT NULL,             -- NULL = همه پلن‌ها
    expire_at     DATE DEFAULT NULL,
    is_active     TINYINT(1) DEFAULT 1,
    created_at    TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (plan_id) REFERENCES plans(id) ON DELETE SET NULL
);

-- =============================================
--   لاگ تراکنش‌ها
-- =============================================
CREATE TABLE IF NOT EXISTS transaction_logs (
    id            INT AUTO_INCREMENT PRIMARY KEY,
    user_id       BIGINT NOT NULL,
    order_id      INT,
    action        VARCHAR(100) NOT NULL,
    amount        INT DEFAULT 0,
    note          TEXT,
    created_at    TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- =============================================
--   ضد اسپم
-- =============================================
CREATE TABLE IF NOT EXISTS rate_limits (
    id            INT AUTO_INCREMENT PRIMARY KEY,
    user_id       BIGINT NOT NULL,
    action        VARCHAR(50) NOT NULL,
    count         INT DEFAULT 1,
    window_start  TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    INDEX idx_user_action (user_id, action)
);

-- =============================================
--   حالت انتظار (State Machine)
-- =============================================
CREATE TABLE IF NOT EXISTS user_states (
    id            INT AUTO_INCREMENT PRIMARY KEY,
    user_id       BIGINT UNIQUE NOT NULL,
    state         VARCHAR(100) NOT NULL,
    data          JSON,
    updated_at    TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

-- =============================================
--   تیکت‌های پشتیبانی
-- =============================================
CREATE TABLE IF NOT EXISTS tickets (
    id            INT AUTO_INCREMENT PRIMARY KEY,
    user_id       BIGINT NOT NULL,
    message       TEXT NOT NULL,
    reply         TEXT,
    status        ENUM('open','closed') DEFAULT 'open',
    created_at    TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- =============================================
--   تنظیمات عمومی
-- =============================================
CREATE TABLE IF NOT EXISTS settings (
    `key`         VARCHAR(100) PRIMARY KEY,
    `value`       TEXT
);

INSERT IGNORE INTO settings (`key`, `value`) VALUES
('channel_id',    '@yourchannel'),
('channel_check', '1'),
('card_number',   '6037-XXXX-XXXX-XXXX'),
('card_owner',    'نام صاحب کارت'),
('bot_photo',     ''),
('welcome_text',  'سلام {name} عزیز! 👋\nبه ربات VPN خوش اومدی.'),
('support_text',  'برای پشتیبانی پیام بده'),
('admin_password','admin1234');

-- =============================================
--   داده‌های نمونه (پلن‌ها)
-- =============================================
INSERT IGNORE INTO plans (id, name, volume_gb, price, max_users, connections, description, sort_order) VALUES
(1, '🔵 ۱۰ گیگ', 10, 100000, 10, 3, 'مناسب استفاده سبک', 1),
(2, '🟡 ۲۰ گیگ', 20, 160000, 20, 3, 'مناسب استفاده متوسط', 2),
(3, '🟢 ۳۰ گیگ', 30, 200000, 20, 3, 'مناسب استفاده سنگین', 3);
