-- install.sql (نصب تازه - همه‌ی قابلیت‌ها تا نسخه‌ی ۲.۲)
-- این فایل را یک‌بار روی دیتابیس MySQL خودتان اجرا کنید.
-- اگر از قبل نسخه‌ی قدیمی‌تری نصب کرده‌اید، از migrate_v2.sql و migrate_v3.sql استفاده کنید.

CREATE TABLE IF NOT EXISTS panels (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(100) NOT NULL,
    base_url VARCHAR(255) NOT NULL,          -- مثال: https://p.parvane.store  (بدون / انتهایی)
    api_key VARCHAR(255) NOT NULL,           -- کلید rk_...
    default_service_id INT NULL,             -- سرویسی که هنگام افزودن پنل انتخاب شد (برای اکانت تست و پلن‌های پیش‌فرض)
    default_service_name VARCHAR(150) NULL,
    is_active TINYINT(1) NOT NULL DEFAULT 1,
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE IF NOT EXISTS bot_users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    telegram_id BIGINT NOT NULL UNIQUE,
    username VARCHAR(100) NULL,
    first_name VARCHAR(150) NULL,
    wallet_balance BIGINT NOT NULL DEFAULT 0,  -- به تومان
    is_blocked TINYINT(1) NOT NULL DEFAULT 0,
    tonpays_disabled TINYINT(1) NOT NULL DEFAULT 0, -- درگاه TonPays فقط برای همین کاربر خاموش شده
    state VARCHAR(50) NULL,
    state_data TEXT NULL,
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- پلن‌های فروش هر پنل: می‌تواند «متری» (کسر بر اساس مصرف) یا «فلت» (قیمت ثابت + سقف کاربر/حجم/زمان) باشد
CREATE TABLE IF NOT EXISTS plans (
    id INT AUTO_INCREMENT PRIMARY KEY,
    panel_id INT NOT NULL,
    name VARCHAR(100) NOT NULL,
    mode ENUM('metered','flat') NOT NULL DEFAULT 'metered',
    price BIGINT NULL,                 -- قیمت یک‌باره (فقط حالت flat) به تومان
    price_per_gb BIGINT NULL,          -- نرخ هر گیگ برای حالت metered؛ NULL یعنی از قیمت سراسری استفاده شود
    max_users INT NULL,                -- سقف تعداد کاربر زیرمجموعه (NULL/۰ = نامحدود)
    extra_user_price BIGINT NULL,      -- قیمت هر کاربر اضافه (تومان) - NULL/۰ = غیرفعال. فقط وقتی max_users ست باشد معنی دارد
    data_limit_gb DECIMAL(10,2) NULL,  -- سقف کل حجم به گیگابایت (NULL/۰ = نامحدود) - فقط حالت flat اعمال می‌شود
    duration_days INT NULL,            -- مدت اعتبار به روز (NULL/۰ = بدون انقضا) - فقط حالت flat
    is_active TINYINT(1) NOT NULL DEFAULT 1,
    sort_order INT NOT NULL DEFAULT 0,
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (panel_id) REFERENCES panels(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE IF NOT EXISTS representatives (
    id INT AUTO_INCREMENT PRIMARY KEY,
    bot_user_id INT NOT NULL,
    panel_id INT NOT NULL,
    plan_id INT NULL,                       -- پلنی که هنگام خرید انتخاب شد (ممکن است بعدا حذف شود، پس NULL مجاز است)
    panel_username VARCHAR(100) NOT NULL,
    panel_password VARCHAR(100) NOT NULL,
    mode ENUM('metered','flat') NOT NULL DEFAULT 'metered',
    price_per_gb BIGINT NOT NULL DEFAULT 0, -- فقط برای mode=metered معنی دارد
    max_users INT NULL,
    extra_user_price BIGINT NOT NULL DEFAULT 0, -- قیمت هر کاربر اضافه، فریزشده از روی پلن هنگام خرید (۰ = غیرفعال)
    data_limit_bytes BIGINT NULL DEFAULT 0,
    expire_at DATETIME NULL,                -- فقط برای mode=flat
    last_usage_bytes BIGINT NOT NULL DEFAULT 0,
    pending_fraction DECIMAL(20,6) NOT NULL DEFAULT 0,
    status ENUM('active','disabled','deleted') NOT NULL DEFAULT 'active',
    disable_reason VARCHAR(100) NULL,       -- مثلا 'no_balance', 'manual', 'expired'
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (bot_user_id) REFERENCES bot_users(id),
    FOREIGN KEY (panel_id) REFERENCES panels(id),
    FOREIGN KEY (plan_id) REFERENCES plans(id) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE IF NOT EXISTS transactions (
    id INT AUTO_INCREMENT PRIMARY KEY,
    bot_user_id INT NOT NULL,
    amount BIGINT NOT NULL,
    receipt_file_id VARCHAR(255) NULL,
    receipt_text VARCHAR(500) NULL,
    status ENUM('pending','approved','rejected') NOT NULL DEFAULT 'pending',
    admin_note VARCHAR(255) NULL,
    reviewed_by BIGINT NULL,                -- آیدی تلگرام ادمینی که تایید/رد کرد
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
    reviewed_at DATETIME NULL,
    FOREIGN KEY (bot_user_id) REFERENCES bot_users(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- پیام‌های اعلام تراکنش که برای هر مالک/ادمین ارسال شده (برای ویرایش همه‌ی پیام‌ها بعد از تایید/رد)
CREATE TABLE IF NOT EXISTS transaction_notifications (
    id INT AUTO_INCREMENT PRIMARY KEY,
    transaction_id INT NOT NULL,
    owner_telegram_id BIGINT NOT NULL,
    message_id BIGINT NOT NULL,
    FOREIGN KEY (transaction_id) REFERENCES transactions(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE IF NOT EXISTS usage_log (
    id INT AUTO_INCREMENT PRIMARY KEY,
    representative_id INT NOT NULL,
    bytes_delta BIGINT NOT NULL,
    cost BIGINT NOT NULL,
    balance_after BIGINT NOT NULL,
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (representative_id) REFERENCES representatives(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE IF NOT EXISTS wallet_adjustments (
    id INT AUTO_INCREMENT PRIMARY KEY,
    bot_user_id INT NOT NULL,
    amount BIGINT NOT NULL,
    reason VARCHAR(255) NULL,
    admin_telegram_id BIGINT NOT NULL,
    balance_after BIGINT NOT NULL,
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (bot_user_id) REFERENCES bot_users(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE IF NOT EXISTS panel_trial_settings (
    panel_id INT PRIMARY KEY,
    enabled TINYINT(1) NOT NULL DEFAULT 1,
    data_limit_gb DECIMAL(10,2) NOT NULL DEFAULT 1,
    duration_hours INT NOT NULL DEFAULT 24,
    max_per_user INT NOT NULL DEFAULT 1,
    reset_days INT NOT NULL DEFAULT 0,
    reset_cycle INT NOT NULL DEFAULT 1,
    last_reset_at DATETIME DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (panel_id) REFERENCES panels(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE IF NOT EXISTS trials (
    id INT AUTO_INCREMENT PRIMARY KEY,
    bot_user_id INT NOT NULL,
    panel_id INT NOT NULL,
    panel_username VARCHAR(120) NOT NULL,
    subscription_url VARCHAR(500) NULL,
    data_limit_bytes BIGINT NOT NULL DEFAULT 0,
    expires_at DATETIME NULL,
    cycle INT NOT NULL DEFAULT 1,
    cleaned TINYINT(1) NOT NULL DEFAULT 0,
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (bot_user_id) REFERENCES bot_users(id),
    FOREIGN KEY (panel_id) REFERENCES panels(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- کانال‌های عضویت اجباری؛ ربات قبل از استفاده عضویت کاربر را در همه‌ی این‌ها چک می‌کند
CREATE TABLE IF NOT EXISTS force_join_channels (
    id INT AUTO_INCREMENT PRIMARY KEY,
    chat_ref VARCHAR(150) NOT NULL,     -- مثلا @mychannel یا -1001234567890
    title VARCHAR(150) NULL,
    invite_link VARCHAR(255) NULL,      -- اگر کانال خصوصی است، لینک دعوت را هم بگذارید
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE IF NOT EXISTS settings (
    `key` VARCHAR(100) PRIMARY KEY,
    `value` VARCHAR(255) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

INSERT INTO settings (`key`, `value`) VALUES ('price_per_gb', '5000')
    ON DUPLICATE KEY UPDATE `key`=`key`;

-- ستون مسیر ورود داشبورد (اگر پنل صفحه‌ی لاگین را در یک مسیر سفارشی/مخفی سرو کند)
ALTER TABLE panels ADD COLUMN dashboard_path VARCHAR(255) NULL AFTER base_url;

-- دامنه‌ی نمایشی اختصاصی: اگر پر شود، به‌جای base_url در لینک ورودی که به کاربران
-- نشان داده می‌شود استفاده می‌شود (خود base_url دست‌نخورده برای تماس‌های API می‌ماند)
ALTER TABLE panels ADD COLUMN login_domain VARCHAR(255) NULL AFTER dashboard_path;

-- بونوس شارژ کیف پول (پلکانی بر اساس مبلغ شارژ)
CREATE TABLE IF NOT EXISTS charge_bonus_tiers (
    id INT AUTO_INCREMENT PRIMARY KEY,
    min_amount BIGINT NOT NULL,           -- حداقل مبلغ شارژ برای فعال شدن این پله
    bonus_percent DECIMAL(5,2) NOT NULL,  -- درصد پاداش (مثلا 10 یعنی 10%)
    is_active TINYINT(1) NOT NULL DEFAULT 1,
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- سابقه‌ی بونوس‌های اعمال‌شده روی تراکنش‌های تایید‌شده
CREATE TABLE IF NOT EXISTS charge_bonus_log (
    id INT AUTO_INCREMENT PRIMARY KEY,
    transaction_id INT NOT NULL,
    tier_id INT NULL,
    bonus_amount BIGINT NOT NULL,
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (transaction_id) REFERENCES transactions(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- کدهای تخفیف برای خرید پلن‌های فلت
CREATE TABLE IF NOT EXISTS discount_codes (
    id INT AUTO_INCREMENT PRIMARY KEY,
    code VARCHAR(50) NOT NULL UNIQUE,
    type ENUM('percent','fixed') NOT NULL DEFAULT 'percent',
    value DECIMAL(12,2) NOT NULL,   -- درصد (0-100) یا مبلغ ثابت به تومان بسته به type
    max_uses INT NULL,              -- NULL = نامحدود
    used_count INT NOT NULL DEFAULT 0,
    is_active TINYINT(1) NOT NULL DEFAULT 1,
    expires_at DATETIME NULL,
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE IF NOT EXISTS discount_code_uses (
    id INT AUTO_INCREMENT PRIMARY KEY,
    code_id INT NOT NULL,
    bot_user_id INT NOT NULL,
    representative_id INT NULL,
    discount_amount BIGINT NOT NULL,
    used_at DATETIME DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (code_id) REFERENCES discount_codes(id),
    FOREIGN KEY (bot_user_id) REFERENCES bot_users(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- درگاه پرداخت آنلاین TonPays (شارژ خودکار کیف پول، بدون نیاز به تایید دستی مالک)
CREATE TABLE IF NOT EXISTS tonpays_invoices (
    id INT AUTO_INCREMENT PRIMARY KEY,
    bot_user_id INT NOT NULL,
    invoice_id VARCHAR(64) NULL,
    order_id VARCHAR(30) NULL,
    request_amount BIGINT NOT NULL,
    final_amount BIGINT NULL,
    status VARCHAR(20) NOT NULL DEFAULT 'creating',
    paid TINYINT(1) NOT NULL DEFAULT 0,
    credited TINYINT(1) NOT NULL DEFAULT 0,
    bonus_amount BIGINT NOT NULL DEFAULT 0,
    invoice_url VARCHAR(500) NULL,
    payment_url VARCHAR(500) NULL,
    card_number VARCHAR(50) NULL,
    card_name VARCHAR(150) NULL,
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
    credited_at DATETIME NULL,
    UNIQUE KEY uniq_invoice_id (invoice_id),
    FOREIGN KEY (bot_user_id) REFERENCES bot_users(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

INSERT INTO settings (`key`, `value`) VALUES ('tonpays_enabled', '0')
    ON DUPLICATE KEY UPDATE `key`=`key`;

-- تایید دستی مدیر برای مواقعی که اعمال خودکار سقف کاربر روی پنل تایید نمی‌شود
-- (رجوع کنید به migrate_v8.sql برای توضیح کامل)
CREATE TABLE IF NOT EXISTS pending_admin_actions (
    id INT AUTO_INCREMENT PRIMARY KEY,
    type ENUM('new_purchase','extra_users') NOT NULL,
    bot_user_id INT NOT NULL,
    panel_id INT NOT NULL,
    representative_id INT NULL,
    panel_username VARCHAR(100) NOT NULL,
    panel_password VARCHAR(100) NULL,
    plan_name VARCHAR(100) NULL,
    target_max_users INT NULL,
    extra_qty INT NULL,
    discount_code_id INT NULL,
    cost BIGINT NOT NULL DEFAULT 0,
    status ENUM('pending','done','rejected') NOT NULL DEFAULT 'pending',
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
    resolved_at DATETIME NULL,
    resolved_by BIGINT NULL,
    reminded_at DATETIME NULL,         -- اگر یک بار یادآوری تاخیر برای مالکین فرستاده شده، اینجا ثبت می‌شود (جلوی اسپم را می‌گیرد)
    FOREIGN KEY (bot_user_id) REFERENCES bot_users(id),
    FOREIGN KEY (panel_id) REFERENCES panels(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE IF NOT EXISTS pending_admin_action_notifications (
    id INT AUTO_INCREMENT PRIMARY KEY,
    action_id INT NOT NULL,
    owner_telegram_id BIGINT NOT NULL,
    message_id BIGINT NOT NULL,
    FOREIGN KEY (action_id) REFERENCES pending_admin_actions(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
