-- =====================================================
-- VPN Shop - Database Schema (MySQL / MariaDB - InnoDB, utf8mb4)
-- سازگار با هاست‌های اشتراکی معمول (MySQL 5.7+ / MariaDB 10.3+)
-- =====================================================

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ---------------------------------------------------
-- ادمین‌های سایت (پنل مدیریت فروشگاه، جدا از پنل‌های VPN)
-- ---------------------------------------------------
CREATE TABLE IF NOT EXISTS admins (
    id            INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    username      VARCHAR(64) NOT NULL UNIQUE,
    password_hash VARCHAR(255) NOT NULL,
    full_name     VARCHAR(128) DEFAULT NULL,
    is_super      TINYINT(1) NOT NULL DEFAULT 0,
    is_active     TINYINT(1) NOT NULL DEFAULT 1,
    created_at    DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- ---------------------------------------------------
-- مشتریان فروشگاه
-- ---------------------------------------------------
CREATE TABLE IF NOT EXISTS customers (
    id             INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    telegram_id    BIGINT DEFAULT NULL UNIQUE,       -- برای ورود از طریق بات تلگرام
    phone          VARCHAR(20) DEFAULT NULL,
    email          VARCHAR(190) DEFAULT NULL UNIQUE,
    email_verified TINYINT(1) NOT NULL DEFAULT 0,
    wallet_balance DECIMAL(14,2) NOT NULL DEFAULT 0,  -- کیف‌پول داخلی (شارژ حساب)
    referral_code  VARCHAR(32) DEFAULT NULL UNIQUE,
    referred_by    INT UNSIGNED DEFAULT NULL,
    is_active      TINYINT(1) NOT NULL DEFAULT 1,
    created_at     DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
    KEY idx_phone (phone)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- ---------------------------------------------------
-- کدهای یک‌بارمصرف تایید ایمیل (ورود/ثبت‌نام مشتری بدون پسورد)
-- ---------------------------------------------------
CREATE TABLE IF NOT EXISTS email_otps (
    id          INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    email       VARCHAR(190) NOT NULL,
    code_hash   VARCHAR(255) NOT NULL,
    attempts    TINYINT UNSIGNED NOT NULL DEFAULT 0,
    expires_at  DATETIME NOT NULL,
    consumed_at DATETIME DEFAULT NULL,
    created_at  DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
    KEY idx_email (email)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- ---------------------------------------------------
-- تنظیمات کلی سیستم که با نصاب/پنل مدیریت پر می‌شن (نه دستی توی کد)
-- مثل SMTP؛ مقدار حساس با Crypto رمزنگاری می‌شه.
-- ---------------------------------------------------
CREATE TABLE IF NOT EXISTS settings (
    id         INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    `key`      VARCHAR(64) NOT NULL UNIQUE,
    value      TEXT DEFAULT NULL,
    updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- ---------------------------------------------------
-- پنل‌های متصل (هر رکورد = یک نصب واقعی از Marzban/PasarGuard/Sanaei/...)
-- ---------------------------------------------------
CREATE TABLE IF NOT EXISTS panels (
    id             INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    name           VARCHAR(100) NOT NULL,             -- نام نمایشی: "آلمان ۱"
    driver         VARCHAR(32)  NOT NULL,              -- pasarguard | marzban | sanaei | xui | ...
    base_url       VARCHAR(255) NOT NULL,              -- https://panel.example.com:8000
    api_username   VARCHAR(128) DEFAULT NULL,
    api_password   VARCHAR(255) DEFAULT NULL,          -- به‌صورت رمزنگاری‌شده ذخیره شود (نه plain)
    api_extra      TEXT DEFAULT NULL,                  -- JSON برای فیلدهای خاص هر پنل (مثلاً inbound_id برای X-UI)
    default_group  VARCHAR(64) DEFAULT NULL,           -- گروه/inbound پیش‌فرض برای ساخت کاربر
    is_active      TINYINT(1) NOT NULL DEFAULT 1,
    sort_order     INT NOT NULL DEFAULT 0,
    created_at     DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
    updated_at     DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- ---------------------------------------------------
-- پلن‌های فروش (بسته‌های حجم/زمان روی یک یا چند پنل)
-- ---------------------------------------------------
CREATE TABLE IF NOT EXISTS plans (
    id             INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    panel_id       INT UNSIGNED DEFAULT NULL,          -- برای delivery_mode=manual می‌تواند NULL باشد
    delivery_mode  ENUM('auto','manual') NOT NULL DEFAULT 'auto', -- auto = ساخت خودکار روی پنل، manual = تحویل از موجودی از‌پیش‌آماده
    title          VARCHAR(150) NOT NULL,
    description    VARCHAR(500) DEFAULT NULL,
    data_limit_gb  DECIMAL(10,2) NOT NULL DEFAULT 0,   -- 0 = نامحدود
    duration_days  INT NOT NULL DEFAULT 30,
    price_toman    DECIMAL(14,0) NOT NULL DEFAULT 0,
    is_active      TINYINT(1) NOT NULL DEFAULT 1,
    sort_order     INT NOT NULL DEFAULT 0,
    created_at     DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
    CONSTRAINT fk_plans_panel FOREIGN KEY (panel_id) REFERENCES panels(id) ON DELETE CASCADE,
    KEY idx_panel (panel_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- ---------------------------------------------------
-- موجودی کانفیگ‌های از‌پیش‌آماده (برای پلن‌های delivery_mode=manual)
-- ادمین از پنل هرکدوم رو دستی می‌سازه، ساب‌لینک/کانفیگ رو اینجا وارد می‌کنه،
-- و سیستم به محض خرید، یک ردیف "استفاده‌نشده" رو به مشتری تحویل می‌ده.
-- ---------------------------------------------------
CREATE TABLE IF NOT EXISTS manual_config_stock (
    id                INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    plan_id           INT UNSIGNED NOT NULL,
    label             VARCHAR(150) DEFAULT NULL,        -- مثلا "آلمان - سرور ۲"
    subscription_url  VARCHAR(500) DEFAULT NULL,
    config_text       TEXT DEFAULT NULL,                -- لینک تک کانفیگ یا متن کامل (اگر ساب‌لینک نداره)
    is_used           TINYINT(1) NOT NULL DEFAULT 0,
    order_id          INT UNSIGNED DEFAULT NULL,         -- سفارشی که این کانفیگ بهش تحویل داده شده
    created_at        DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
    used_at           DATETIME DEFAULT NULL,
    CONSTRAINT fk_manual_stock_plan FOREIGN KEY (plan_id) REFERENCES plans(id) ON DELETE CASCADE,
    CONSTRAINT fk_manual_stock_order FOREIGN KEY (order_id) REFERENCES orders(id) ON DELETE SET NULL,
    KEY idx_plan_unused (plan_id, is_used)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- ---------------------------------------------------
-- محصولات جانبی: فروش خودِ پنل (نصب/لایسنس/راه‌اندازی)
-- ---------------------------------------------------
CREATE TABLE IF NOT EXISTS panel_products (
    id             INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    title          VARCHAR(150) NOT NULL,              -- مثلا "نصب و راه‌اندازی مرزبان روی سرور شما"
    driver         VARCHAR(32) NOT NULL,                -- نوع پنلی که فروخته می‌شود
    description    TEXT DEFAULT NULL,
    price_toman    DECIMAL(14,0) NOT NULL DEFAULT 0,
    delivery_type  ENUM('manual','script') NOT NULL DEFAULT 'manual', -- تحویل دستی توسط ادمین یا اسکریپت خودکار
    is_active      TINYINT(1) NOT NULL DEFAULT 1,
    created_at     DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- ---------------------------------------------------
-- سفارش‌ها (هم برای پلن VPN و هم برای پنل)
-- ---------------------------------------------------
CREATE TABLE IF NOT EXISTS orders (
    id              INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    customer_id     INT UNSIGNED NOT NULL,
    order_type      ENUM('vpn_plan','panel_product') NOT NULL,
    plan_id         INT UNSIGNED DEFAULT NULL,
    panel_product_id INT UNSIGNED DEFAULT NULL,
    amount_toman    DECIMAL(14,0) NOT NULL,
    status          ENUM('pending','paid','failed','delivered','cancelled') NOT NULL DEFAULT 'pending',
    source          ENUM('web','telegram') NOT NULL DEFAULT 'web',
    admin_note      TEXT DEFAULT NULL,             -- برای تحویل دستی سفارش‌های فروش پنل (لایسنس/راهنما/اطلاعات دسترسی)
    created_at      DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
    paid_at         DATETIME DEFAULT NULL,
    delivered_at    DATETIME DEFAULT NULL,
    CONSTRAINT fk_orders_customer FOREIGN KEY (customer_id) REFERENCES customers(id) ON DELETE CASCADE,
    CONSTRAINT fk_orders_plan FOREIGN KEY (plan_id) REFERENCES plans(id) ON DELETE SET NULL,
    CONSTRAINT fk_orders_panel_product FOREIGN KEY (panel_product_id) REFERENCES panel_products(id) ON DELETE SET NULL,
    KEY idx_customer (customer_id),
    KEY idx_status (status)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- ---------------------------------------------------
-- تراکنش‌های پرداخت (هر درگاه یک رکورد؛ چند تلاش برای یک سفارش ممکن است)
-- ---------------------------------------------------
CREATE TABLE IF NOT EXISTS transactions (
    id             INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    order_id       INT UNSIGNED NOT NULL,
    gateway        VARCHAR(32) NOT NULL,               -- zarinpal | crypto | arzpay | balepay | wallet | ...
    authority      VARCHAR(191) DEFAULT NULL,          -- کد پیگیری درگاه
    ref_id         VARCHAR(191) DEFAULT NULL,          -- شماره تراکنش نهایی
    amount_toman   DECIMAL(14,0) NOT NULL,
    status         ENUM('initiated','success','failed') NOT NULL DEFAULT 'initiated',
    raw_response   TEXT DEFAULT NULL,
    created_at     DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
    CONSTRAINT fk_tx_order FOREIGN KEY (order_id) REFERENCES orders(id) ON DELETE CASCADE,
    KEY idx_order (order_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- ---------------------------------------------------
-- سرویس‌های تحویل‌شده به مشتری (کانفیگ‌های VPN فعال)
-- ---------------------------------------------------
CREATE TABLE IF NOT EXISTS services (
    id               INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    order_id         INT UNSIGNED NOT NULL,
    customer_id      INT UNSIGNED NOT NULL,
    panel_id         INT UNSIGNED DEFAULT NULL,       -- برای سرویس‌های manual بدون پنل زنده می‌تواند NULL باشد
    remote_username  VARCHAR(191) NOT NULL,           -- یوزرنیم/ایمیل داخل پنل VPN
    remote_uuid      VARCHAR(64) DEFAULT NULL,        -- فقط برای X-UI/Sanaei: uuid کلاینت (لازم برای تمدید/حذف)
    subscription_url VARCHAR(500) DEFAULT NULL,       -- ساب‌لینک تحویلی
    data_limit_gb    DECIMAL(10,2) NOT NULL DEFAULT 0,
    expires_at       DATETIME DEFAULT NULL,
    status           ENUM('active','expired','disabled') NOT NULL DEFAULT 'active',
    created_at       DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
    CONSTRAINT fk_services_order FOREIGN KEY (order_id) REFERENCES orders(id) ON DELETE CASCADE,
    CONSTRAINT fk_services_customer FOREIGN KEY (customer_id) REFERENCES customers(id) ON DELETE CASCADE,
    CONSTRAINT fk_services_panel FOREIGN KEY (panel_id) REFERENCES panels(id) ON DELETE SET NULL,
    KEY idx_customer (customer_id),
    KEY idx_expires (expires_at)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

SET FOREIGN_KEY_CHECKS = 1;

-- ---------------------------------------------------
-- درگاه‌های پرداخت فعال (معماری پلاگین‌محور مثل پنل‌ها)
-- ---------------------------------------------------
CREATE TABLE IF NOT EXISTS payment_gateways (
    id           INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    code         VARCHAR(32) NOT NULL UNIQUE,     -- zarinpal | manual_review | ...
    title        VARCHAR(100) NOT NULL,           -- نام نمایشی به مشتری
    driver       VARCHAR(32) NOT NULL,            -- zarinpal | manual_review
    config       TEXT DEFAULT NULL,               -- JSON رمزنگاری‌شده (merchant_id و ...)
    instructions TEXT DEFAULT NULL,               -- برای manual_review: متن راهنما (آدرس کیف‌پول/شماره کارت)
    is_active    TINYINT(1) NOT NULL DEFAULT 1,
    sort_order   INT NOT NULL DEFAULT 0,
    created_at   DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
