-- VPN Panel Database Schema
-- Created for complete VPN management system

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

-- جدول کاربران
CREATE TABLE users (
    id INT PRIMARY KEY AUTO_INCREMENT,
    username VARCHAR(50) UNIQUE NOT NULL,
    email VARCHAR(100) UNIQUE NOT NULL,
    password VARCHAR(255) NOT NULL,
    full_name VARCHAR(100),
    phone VARCHAR(20),
    role ENUM('admin', 'user') DEFAULT 'user',
    status ENUM('active', 'suspended', 'expired') DEFAULT 'active',
    balance DECIMAL(10, 2) DEFAULT 0.00,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    last_login TIMESTAMP NULL,
    INDEX idx_email (email),
    INDEX idx_username (username),
    INDEX idx_status (status)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- جدول سرورها
CREATE TABLE servers (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(100) NOT NULL,
    location VARCHAR(50),
    ip_address VARCHAR(45) NOT NULL,
    port INT NOT NULL,
    protocol ENUM('vmess', 'vless', 'trojan', 'shadowsocks', 'openvpn') DEFAULT 'vmess',
    status ENUM('online', 'offline', 'maintenance') DEFAULT 'online',
    max_users INT DEFAULT 100,
    current_users INT DEFAULT 0,
    bandwidth_limit BIGINT DEFAULT 0, -- GB
    bandwidth_used BIGINT DEFAULT 0,
    cpu_usage DECIMAL(5, 2) DEFAULT 0.00,
    ram_usage DECIMAL(5, 2) DEFAULT 0.00,
    config_data TEXT,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    INDEX idx_status (status),
    INDEX idx_location (location)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- جدول اشتراک‌ها
CREATE TABLE subscriptions (
    id INT PRIMARY KEY AUTO_INCREMENT,
    user_id INT NOT NULL,
    server_id INT NOT NULL,
    plan_name VARCHAR(50),
    duration_days INT NOT NULL, -- مدت زمان به روز
    traffic_limit BIGINT DEFAULT 0, -- GB
    traffic_used BIGINT DEFAULT 0,
    start_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    expire_date TIMESTAMP NOT NULL,
    status ENUM('active', 'expired', 'suspended') DEFAULT 'active',
    price DECIMAL(10, 2),
    config_url TEXT, -- لینک کانفیگ
    uuid VARCHAR(255), -- UUID برای V2Ray
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
    FOREIGN KEY (server_id) REFERENCES servers(id) ON DELETE CASCADE,
    INDEX idx_user (user_id),
    INDEX idx_server (server_id),
    INDEX idx_status (status),
    INDEX idx_expire (expire_date)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- جدول تراکنش‌ها
CREATE TABLE transactions (
    id INT PRIMARY KEY AUTO_INCREMENT,
    user_id INT NOT NULL,
    amount DECIMAL(10, 2) NOT NULL,
    type ENUM('payment', 'refund', 'bonus') DEFAULT 'payment',
    status ENUM('pending', 'completed', 'failed') DEFAULT 'pending',
    gateway VARCHAR(50), -- zarinpal, idpay, etc.
    transaction_id VARCHAR(255),
    description TEXT,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
    INDEX idx_user (user_id),
    INDEX idx_status (status),
    INDEX idx_transaction (transaction_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- جدول پلن‌ها
CREATE TABLE plans (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(100) NOT NULL,
    duration_days INT NOT NULL,
    traffic_limit BIGINT NOT NULL, -- GB
    price DECIMAL(10, 2) NOT NULL,
    description TEXT,
    status ENUM('active', 'inactive') DEFAULT 'active',
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    INDEX idx_status (status)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- جدول تیکت‌ها
CREATE TABLE tickets (
    id INT PRIMARY KEY AUTO_INCREMENT,
    user_id INT NOT NULL,
    subject VARCHAR(200) NOT NULL,
    status ENUM('open', 'answered', 'closed') DEFAULT 'open',
    priority ENUM('low', 'medium', 'high') DEFAULT 'medium',
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
    INDEX idx_user (user_id),
    INDEX idx_status (status)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- جدول پیام‌های تیکت
CREATE TABLE ticket_messages (
    id INT PRIMARY KEY AUTO_INCREMENT,
    ticket_id INT NOT NULL,
    user_id INT NOT NULL,
    message TEXT NOT NULL,
    is_admin BOOLEAN DEFAULT FALSE,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (ticket_id) REFERENCES tickets(id) ON DELETE CASCADE,
    FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
    INDEX idx_ticket (ticket_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- جدول لاگ‌ها
CREATE TABLE logs (
    id INT PRIMARY KEY AUTO_INCREMENT,
    user_id INT,
    action VARCHAR(100),
    description TEXT,
    ip_address VARCHAR(45),
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE SET NULL,
    INDEX idx_user (user_id),
    INDEX idx_action (action)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- داده‌های اولیه

-- ادمین پیش‌فرض (password: admin123)
INSERT INTO users (username, email, password, full_name, role) VALUES
('admin', 'admin@vpnpanel.com', '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', 'مدیر سیستم', 'admin');

-- سرورهای نمونه
INSERT INTO servers (name, location, ip_address, port, protocol, status, max_users) VALUES
('Server Germany 1', 'Germany', '45.142.212.100', 443, 'vmess', 'online', 100),
('Server USA 1', 'United States', '192.155.90.50', 443, 'vless', 'online', 150),
('Server Netherlands 1', 'Netherlands', '89.185.85.20', 443, 'trojan', 'online', 120),
('Server France 1', 'France', '51.210.105.30', 443, 'vmess', 'maintenance', 80);

-- پلن‌های نمونه
INSERT INTO plans (name, duration_days, traffic_limit, price, description, status) VALUES
('پلن ماهانه پایه', 30, 50, 50000, '50 گیگابایت ترافیک - 30 روز', 'active'),
('پلن ماهانه نقره‌ای', 30, 100, 90000, '100 گیگابایت ترافیک - 30 روز', 'active'),
('پلن ماهانه طلایی', 30, 200, 150000, '200 گیگابایت ترافیک - 30 روز', 'active'),
('پلن 3 ماهه', 90, 300, 400000, '300 گیگابایت ترافیک - 90 روز', 'active'),
('پلن 6 ماهه', 180, 700, 750000, '700 گیگابایت ترافیک - 180 روز', 'active'),
('پلن سالانه', 365, 1500, 1400000, '1500 گیگابایت ترافیک - 365 روز', 'active');

-- کاربران تست
INSERT INTO users (username, email, password, full_name, phone, balance) VALUES
('user1', 'user1@test.com', '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', 'علی احمدی', '09123456789', 100000),
('user2', 'user2@test.com', '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', 'محمد رضایی', '09123456788', 50000);

-- اشتراک‌های تست
INSERT INTO subscriptions (user_id, server_id, plan_name, duration_days, traffic_limit, expire_date, status, price, uuid) VALUES
(2, 1, 'پلن ماهانه پایه', 30, 50, DATE_ADD(NOW(), INTERVAL 25 DAY), 'active', 50000, UUID()),
(3, 2, 'پلن ماهانه نقره‌ای', 30, 100, DATE_ADD(NOW(), INTERVAL 20 DAY), 'active', 90000, UUID());
