/**
 * Plugin Helpers - 插件相关的辅助函数
 * 提供插件路径解析和扫描功能，供 PluginManager 和 DefaultPlugins 共用
 */

const fs = require('fs');
const path = require('path');
const { safeJsonParse } = require('./index');

/**
 * 解析插件路径
 * 支持两种结构：
 * 1. 文件夹结构: .agent/plugins/my-plugin/index.js
 * 2. 单文件结构: .agent/plugins/my-plugin.js
 * @param {string} pluginsDir - 插件目录
 * @param {string} name - 插件名称
 * @param {Object} options - 选项
 * @param {Object} options.logger - 日志器（可选）
 * @returns {{path: string, type: 'folder'|'file'}|null} 插件路径和类型
 */
function resolvePluginPath(pluginsDir, name, options = {}) {
  const logger = options.logger;
  const folderPath = path.join(pluginsDir, name);
  const filePath = path.join(pluginsDir, `${name}.js`);

  // 文件夹优先
  if (fs.existsSync(folderPath) && fs.statSync(folderPath).isDirectory()) {
    const pkgPath = path.join(folderPath, 'package.json');
    if (fs.existsSync(pkgPath)) {
      try {
        const pkg = safeJsonParse(fs.readFileSync(pkgPath, 'utf-8'), {});
        const main = pkg.main || 'index.js';
        const mainPath = path.join(folderPath, main);
        if (fs.existsSync(mainPath)) {
          return { path: mainPath, type: 'folder' };
        }
      } catch (err) {
        logger?.warn(`Failed to parse package.json for ${name}:`, err.message);
      }
    }
    // 默认加载 index.js
    const indexPath = path.join(folderPath, 'index.js');
    if (fs.existsSync(indexPath)) {
      return { path: indexPath, type: 'folder' };
    }
    logger?.warn(`No entry point found for plugin folder: ${name}`);
    return null;
  }

  // 单文件回退
  if (fs.existsSync(filePath)) {
    return { path: filePath, type: 'file' };
  }

  return null;
}

/**
 * 扫描插件目录，返回所有插件名称
 * @param {string} pluginsDir - 插件目录
 * @returns {string[]} 插件名称列表
 */
function scanPluginNames(pluginsDir) {
  if (!fs.existsSync(pluginsDir)) {
    return [];
  }

  // 忽略的目录/文件（无意义或系统文件）
  const IGNORE_PATTERNS = new Set([
    '__pycache__',
    'node_modules',
    '.git',
    '.svn',
    '.hg',
    '__MACOSX',
    '.DS_Store',
    'Thumbs.db',
  ]);

  const names = new Set();
  const entries = fs.readdirSync(pluginsDir, { withFileTypes: true });

  for (const entry of entries) {
    // 跳过忽略列表中的条目
    if (IGNORE_PATTERNS.has(entry.name)) {
      continue;
    }

    if (entry.isDirectory()) {
      // 文件夹插件
      names.add(entry.name);
    } else if (entry.isFile() && entry.name.endsWith('.js')) {
      // 单文件插件（排除与文件夹同名的）
      const baseName = entry.name.replace(/\.js$/, '');
      if (!names.has(baseName)) {
        names.add(baseName);
      }
    }
  }

  return Array.from(names);
}

module.exports = {
  resolvePluginPath,
  scanPluginNames,
};
