-- ===========================================================
-- سیستم مدیریت لایسنس Borj License Server
-- MySQL 5.7+ / MariaDB 10.3+
-- ===========================================================
-- نحوه اجرا:
-- از phpMyAdmin: این فایل را Import کنید
-- یا از خط فرمان: mysql -u user -p dbname < schema.sql
-- ===========================================================


-- ===========================================================
-- محصولات (هر نرم‌افزار یک محصول است)
-- ===========================================================
CREATE TABLE IF NOT EXISTS `products` (
  `id`          INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  `name`        VARCHAR(150) NOT NULL,
  `slug`        VARCHAR(100) NOT NULL UNIQUE, -- شناسه یکتا برای API (مثلا: portal-builder)
  `description` TEXT,
  `version`     VARCHAR(20)  DEFAULT '1.0.0',
  `is_active`   TINYINT(1)   DEFAULT 1,
  `created_at`  DATETIME     DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- ===========================================================
-- پلن‌های هر محصول (مثلا: ماهانه، سالانه، مادام‌العمر)
-- ===========================================================
CREATE TABLE IF NOT EXISTS `plans` (
  `id`              INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  `product_id`      INT UNSIGNED NOT NULL,
  `name`            VARCHAR(100) NOT NULL,       -- مثلا: سالانه ۵ دامنه
  `max_domains`     INT          DEFAULT 1,       -- تعداد دامنه مجاز
  `duration_days`   INT          DEFAULT 365,     -- مدت اعتبار (0 = مادام‌العمر)
  `price`           DECIMAL(10,2) DEFAULT 0,
  `currency`        VARCHAR(10)  DEFAULT 'USD',
  `features`        JSON,                         -- آپشن‌های اضافی JSON
  `is_active`       TINYINT(1)   DEFAULT 1,
  `created_at`      DATETIME     DEFAULT CURRENT_TIMESTAMP,
  FOREIGN KEY (`product_id`) REFERENCES `products`(`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- ===========================================================
-- مشتریان
-- ===========================================================
CREATE TABLE IF NOT EXISTS `customers` (
  `id`         INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  `name`       VARCHAR(150) NOT NULL,
  `email`      VARCHAR(200) NOT NULL UNIQUE,
  `phone`      VARCHAR(30),
  `company`    VARCHAR(150),
  `notes`      TEXT,
  `created_at` DATETIME DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- ===========================================================
-- لایسنس‌ها (قلب سیستم)
-- ===========================================================
CREATE TABLE IF NOT EXISTS `licenses` (
  `id`            INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  `license_key`   VARCHAR(60)  NOT NULL UNIQUE, -- کلید لایسنس (مثلا: XXXXX-XXXXX-XXXXX-XXXXX)
  `customer_id`   INT UNSIGNED NOT NULL,
  `product_id`    INT UNSIGNED NOT NULL,
  `plan_id`       INT UNSIGNED NOT NULL,

  -- محدودیت دامنه
  `max_domains`   INT          DEFAULT 1,

  -- تاریخ‌ها
  `issued_at`     DATETIME     DEFAULT CURRENT_TIMESTAMP,
  `expires_at`    DATETIME     NULL,             -- NULL = مادام‌العمر

  -- وضعیت
  `status`        ENUM('active','expired','suspended','revoked') DEFAULT 'active',
  `notes`         TEXT,

  -- اطلاعات خرید
  `payment_method` VARCHAR(50), -- manual, paypal, crypto
  `payment_ref`    VARCHAR(200),
  `amount_paid`    DECIMAL(10,2) DEFAULT 0,

  `created_at`    DATETIME     DEFAULT CURRENT_TIMESTAMP,
  `updated_at`    DATETIME     DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,

  FOREIGN KEY (`customer_id`) REFERENCES `customers`(`id`),
  FOREIGN KEY (`product_id`)  REFERENCES `products`(`id`),
  FOREIGN KEY (`plan_id`)     REFERENCES `plans`(`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- ===========================================================
-- دامنه‌های ثبت‌شده برای هر لایسنس
-- ===========================================================
CREATE TABLE IF NOT EXISTS `license_domains` (
  `id`           INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  `license_id`   INT UNSIGNED NOT NULL,
  `domain`       VARCHAR(255) NOT NULL, -- بدون http/https و slash آخر
  `added_at`     DATETIME     DEFAULT CURRENT_TIMESTAMP,
  `last_seen_at` DATETIME     NULL,     -- آخرین بار که heartbeat زد
  `last_ip`      VARCHAR(45)  NULL,     -- IP سرور مشتری (اطلاعاتی، نه قفل)
  FOREIGN KEY (`license_id`) REFERENCES `licenses`(`id`) ON DELETE CASCADE,
  UNIQUE KEY `uniq_license_domain` (`license_id`, `domain`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- ===========================================================
-- لاگ همه رویدادها (audit trail)
-- ===========================================================
CREATE TABLE IF NOT EXISTS `license_logs` (
  `id`         INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  `license_id` INT UNSIGNED,
  `action`     VARCHAR(50)  NOT NULL, -- verify_ok, verify_fail, issued, revoked, ...
  `domain`     VARCHAR(255),
  `ip`         VARCHAR(45),
  `detail`     TEXT,
  `created_at` DATETIME DEFAULT CURRENT_TIMESTAMP,
  INDEX `idx_license_logs_license` (`license_id`),
  INDEX `idx_license_logs_created` (`created_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- ===========================================================
-- مدیران سیستم لایسنس
-- ===========================================================
CREATE TABLE IF NOT EXISTS `admins` (
  `id`           INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  `username`     VARCHAR(60)  NOT NULL UNIQUE,
  `password`     VARCHAR(255) NOT NULL, -- bcrypt
  `email`        VARCHAR(200) NOT NULL UNIQUE,
  `api_key`      VARCHAR(64)  NOT NULL UNIQUE, -- برای Admin API
  `role`         ENUM('super','staff') DEFAULT 'staff',
  `is_active`    TINYINT(1)   DEFAULT 1,
  `created_at`   DATETIME     DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- ===========================================================
-- توکن‌های API برای سایت فروش (Commerce API)
-- ===========================================================
CREATE TABLE IF NOT EXISTS `api_tokens` (
  `id`          INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  `name`        VARCHAR(100) NOT NULL,  -- مثلا: سایت فروش اصلی
  `token`       VARCHAR(64)  NOT NULL UNIQUE,
  `permissions` SET('purchase','renew','verify','read') DEFAULT 'verify',
  `is_active`   TINYINT(1)   DEFAULT 1,
  `created_at`  DATETIME     DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
