import * as fs from 'fs';
import * as path from 'path';
import type { AgentConfigFile } from './types.js';

/**
 * 配置文件搜索路径
 */
const CONFIG_PATHS = [
  '.ai-assist/agents.yaml',
  '.ai-assist/agents.yml',
  '.ai-assist/agents.json',
  '.ai-assist.yaml',
  '.ai-assist.yml',
];

/**
 * 解析 YAML 内容
 */
async function parseYaml(content: string): Promise<unknown> {
  try {
    const yaml = await import('js-yaml');
    return yaml.load(content);
  } catch {
    console.warn('解析 YAML 配置文件失败');
    return null;
  }
}

/**
 * 加载用户自定义 Agent 配置
 * @param workdir 工作目录
 * @returns 配置对象或 null
 */
export async function loadAgentConfig(workdir: string): Promise<AgentConfigFile | null> {
  for (const configPath of CONFIG_PATHS) {
    const fullPath = path.join(workdir, configPath);

    try {
      if (!fs.existsSync(fullPath)) {
        continue;
      }

      const content = await fs.promises.readFile(fullPath, 'utf-8');

      let config: unknown;

      if (configPath.endsWith('.json')) {
        config = JSON.parse(content);
      } else if (configPath.endsWith('.yaml') || configPath.endsWith('.yml')) {
        config = await parseYaml(content);
        if (!config) continue;
      } else {
        continue;
      }

      // 验证配置格式
      if (isValidAgentConfig(config)) {
        return config;
      } else {
        console.warn(`Agent 配置格式无效: ${fullPath}`);
      }
    } catch (error) {
      console.warn(`加载 Agent 配置失败: ${fullPath}`, error);
    }
  }

  return null;
}

/**
 * 验证配置格式是否有效
 */
function isValidAgentConfig(config: unknown): config is AgentConfigFile {
  if (typeof config !== 'object' || config === null) {
    return false;
  }

  const obj = config as Record<string, unknown>;

  // defaults 是可选的
  if (obj.defaults !== undefined && typeof obj.defaults !== 'object') {
    return false;
  }

  // agents 是可选的
  if (obj.agents !== undefined && typeof obj.agents !== 'object') {
    return false;
  }

  return true;
}

/**
 * 保存 Agent 配置到文件
 * @param workdir 工作目录
 * @param config 配置对象
 * @param format 文件格式
 */
export async function saveAgentConfig(
  workdir: string,
  config: AgentConfigFile,
  format: 'json' | 'yaml' = 'json'
): Promise<void> {
  const dir = path.join(workdir, '.ai-assist');

  // 确保目录存在
  if (!fs.existsSync(dir)) {
    await fs.promises.mkdir(dir, { recursive: true });
  }

  const filename = format === 'json' ? 'agents.json' : 'agents.yaml';
  const fullPath = path.join(dir, filename);

  let content: string;

  if (format === 'json') {
    content = JSON.stringify(config, null, 2);
  } else {
    try {
      const yaml = await import('js-yaml');
      content = yaml.dump(config, { indent: 2, lineWidth: 120 });
    } catch {
      // 回退到 JSON
      content = JSON.stringify(config, null, 2);
      console.warn('保存 YAML 失败，已保存为 JSON 格式');
    }
  }

  await fs.promises.writeFile(fullPath, content, 'utf-8');
}

/**
 * 获取配置文件模板
 */
export function getConfigTemplate(): AgentConfigFile {
  return {
    defaults: {
      maxSteps: 15,
      model: {
        temperature: 0.7,
      },
      permission: {
        bash: {
          rules: [
            { pattern: 'rm -rf *', action: 'deny' },
            { pattern: 'git push --force*', action: 'deny' },
          ],
        },
      },
    },
    agents: {
      'custom-agent': {
        description: '自定义 Agent 示例',
        mode: 'subagent',
        prompt: '你是一个自定义助手。',
        tools: {
          disabled: ['bash'],
        },
        permission: {
          file: {
            read: 'allow',
            write: 'ask',
          },
        },
        maxSteps: 10,
      },
    },
  };
}
