/**
 * PID & Slug 工具函数
 *
 * - generateInternalPid(db): 生成系统内部编号 VPS-000001
 * - generateSlug(name, merchantName, existingSlugs): 生成前台友好 URL slug
 * - parseProviderPid(url): 从购买链接解析商家产品 ID
 * - autoFillPidFields(db, data): 创建/编辑产品时自动填充字段
 */

const { URL } = require('url');

/**
 * 生成下一个系统内部 PID: VPS-000001, VPS-000002, ...
 */
function generateInternalPid(db) {
  const row = db.prepare(
    "SELECT internal_pid FROM products WHERE internal_pid IS NOT NULL AND internal_pid LIKE 'VPS-%' ORDER BY internal_pid DESC LIMIT 1"
  ).get();

  let nextNum = 1;
  if (row && row.internal_pid) {
    const match = row.internal_pid.match(/^VPS-(\d+)$/);
    if (match) {
      nextNum = parseInt(match[1], 10) + 1;
    }
  }

  return `VPS-${String(nextNum).padStart(6, '0')}`;
}

/**
 * 将字符串转为 URL 安全的 slug
 * - 英文：小写 + 连字符
 * - 中文/其他：pinyin 不引入，直接用 encodeURIComponent 兜底
 * - 去掉特殊字符
 */
function slugify(str) {
  return str
    .toLowerCase()
    .replace(/[^\w\u4e00-\u9fa5\s-]/g, '') // 保留字母、数字、中文、空格、连字符
    .replace(/[\s_]+/g, '-')                // 空格/下划线 → 连字符
    .replace(/-+/g, '-')                    // 多个连字符合并
    .replace(/^-|-$/g, '');                 // 去掉首尾连字符
}

/**
 * 生成 slug，格式: merchantName-productName，自动处理冲突
 * @param {string} productName 产品名
 * @param {string} merchantName 商家名
 * @param {Set<string>} existingSlugs 已存在的 slug 集合
 * @returns {string}
 */
function generateSlug(productName, merchantName, existingSlugs) {
  const parts = [];
  if (merchantName) parts.push(slugify(merchantName));
  parts.push(slugify(productName));

  let base = parts.filter(Boolean).join('-') || 'product';
  let candidate = base;
  let i = 2;

  while (existingSlugs && existingSlugs.has(candidate)) {
    candidate = `${base}-${i}`;
    i++;
  }

  return candidate;
}

/**
 * 从 URL 解析商家产品 ID（provider_pid）
 *
 * 解析规则（按优先级）：
 * 1. pid=XX — 最明确
 * 2. product=XX / product_id=XX
 * 3. plan=XX / plan_id=XX
 * 4. package=XX / package_id=XX
 * 5. id=XX — 仅当 URL path 包含特定关键词时才识别（避免误判）
 *
 * @param {string} urlStr URL 字符串
 * @returns {string|null} 商家产品 ID，或 null
 */
function parseProviderPid(urlStr) {
  if (!urlStr) return null;

  try {
    const u = new URL(urlStr);
    const params = u.searchParams;

    // 高优先级参数（直接识别）
    const highPriorityKeys = ['pid', 'product', 'product_id', 'productid', 'plan', 'plan_id', 'planid', 'package', 'package_id', 'packageid'];
    for (const key of highPriorityKeys) {
      const val = params.get(key);
      if (val && /^\d+$/.test(val)) {
        return val;
      }
    }

    // id 参数 — 仅在 URL 路径包含商品/产品相关关键词时识别
    const idVal = params.get('id');
    if (idVal && /^\d+$/.test(idVal)) {
      const pathAndSearch = (u.pathname + u.search).toLowerCase();
      const productContextKeywords = [
        'product', 'plan', 'package', 'cart', 'order', 'store', 'shop',
        'buy', 'purchase', 'checkout', 'aff', 'billing', 'hosting',
        'vps', 'server', 'dedi', 'service'
      ];
      if (productContextKeywords.some(kw => pathAndSearch.includes(kw))) {
        return idVal;
      }
    }

    // 尝试从 URL 路径解析，如 /product/28 或 /plan/28
    const pathMatch = u.pathname.match(/\/(product|plan|package|pid)[s]?\/(\d+)/i);
    if (pathMatch) {
      return pathMatch[2];
    }

    return null;
  } catch {
    return null;
  }
}

/**
 * 创建/编辑产品时自动填充 internal_pid / slug / provider_pid
 *
 * @param {object} db better-sqlite3 实例
 * @param {object} data 产品数据 { internal_pid, slug, provider_pid, name, merchant_id, buy_url, url, id? }
 *   - id: 编辑时传入，新建时不传
 * @returns {object} 填充后的 { internal_pid, slug, provider_pid }
 */
function autoFillPidFields(db, data) {
  let { internal_pid, slug, provider_pid, name, merchant_id, buy_url, url, id } = data;

  // 1. internal_pid
  if (!internal_pid) {
    internal_pid = generateInternalPid(db);
  }

  // 2. slug
  if (!slug) {
    const merchant = db.prepare('SELECT name FROM merchants WHERE id = ?').get(merchant_id);
    const merchantName = merchant ? merchant.name : '';
    // 收集已有 slug（排除自己）
    let query = "SELECT slug FROM products WHERE slug IS NOT NULL AND slug != ''";
    const params = [];
    if (id) {
      query += ' AND id != ?';
      params.push(id);
    }
    const existingSlugs = new Set(db.prepare(query).all(...params).map(r => r.slug));
    slug = generateSlug(name, merchantName, existingSlugs);
  }

  // 3. provider_pid
  if (!provider_pid) {
    provider_pid = parseProviderPid(buy_url) || parseProviderPid(url) || null;
  }

  return { internal_pid, slug, provider_pid };
}

module.exports = {
  generateInternalPid,
  generateSlug,
  slugify,
  parseProviderPid,
  autoFillPidFields,
};
