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

/**
 * 全局配置目录
 */
const GLOBAL_CONFIG_DIR = getConfigDir();

/**
 * 加载用户自定义 Agent 配置
 * 从 ~/.ai-terminal-assistant/agents.json 读取
 *
 * @param _workdir 工作目录（保留参数以兼容现有调用，但不再使用）
 * @returns 配置对象或 null
 */
export async function loadAgentConfig(_workdir: string): Promise<AgentConfigFile | null> {
  const configPath = path.join(GLOBAL_CONFIG_DIR, 'agents.json');

  try {
    if (!fs.existsSync(configPath)) {
      return null;
    }

    const content = await fs.promises.readFile(configPath, 'utf-8');
    const config = JSON.parse(content);

    // 验证配置格式
    if (isValidAgentConfig(config)) {
      return config;
    } else {
      console.warn(`Agent 配置格式无效: ${configPath}`);
    }
  } catch (error) {
    console.warn(`加载 Agent 配置失败: ${configPath}`, 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 配置到文件
 * 保存到 ~/.ai-terminal-assistant/agents.json
 *
 * @param _workdir 工作目录（保留参数以兼容现有调用，但不再使用）
 * @param config 配置对象
 * @param _format 文件格式（保留参数以兼容现有调用，但只使用 json）
 */
export async function saveAgentConfig(
  _workdir: string,
  config: AgentConfigFile,
  _format: 'json' | 'yaml' = 'json'
): Promise<void> {
  // 确保目录存在
  if (!fs.existsSync(GLOBAL_CONFIG_DIR)) {
    await fs.promises.mkdir(GLOBAL_CONFIG_DIR, { recursive: true });
  }

  const fullPath = path.join(GLOBAL_CONFIG_DIR, 'agents.json');
  const content = JSON.stringify(config, null, 2);

  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,
      },
    },
  };
}
