const express = require('express');
const prisma = require('../lib/prisma');
const { apiKeyMiddleware } = require('../lib/auth');
const { verifySyncToken } = require('../lib/sync-token');

const router = express.Router();

// 转义 YAML 字符串值：双引号包裹，转义内部反斜杠和双引号
function yamlString(value) {
  const escaped = String(value).replace(/\\/g, '\\\\').replace(/"/g, '\\"');
  return `"${escaped}"`;
}

// 过滤注释行中的换行符，防止注释注入
function sanitizeComment(value) {
  return String(value).replace(/[\r\n]/g, ' ');
}

// 将 EternalAI 角色数据适配为 Hermes config.yaml 格式
function adaptToHermesConfig(role) {
  const lines = [
    '# Hermes Agent Config — generated by EternalAI',
    `# Character: ${sanitizeComment(role.displayName)}`,
    `# Agent ID: ${sanitizeComment(role.agentId || 'default')}`,
    `# Generated at: ${new Date().toISOString()}`,
    '',
    `model: ${yamlString(role.model)}`,
    `temperature: ${role.temperature ?? 0.85}`,
    `max_tokens: ${role.maxTokens ?? 2048}`,
    '',
    'memory:',
    `  enabled: ${role.enableMemory ?? true}`,
    '  storage: local',
  ];

  if (role.enableTools) {
    lines.push('', 'tools:', '  enabled: true', '  toolsets:', '    - memory');
  }

  lines.push('', 'terminal:', '  backend: local', '');
  return lines.join('\n');
}

// 统一认证中间件：支持 sync_token、API Key、JWT 三种认证方式
async function hermesAuthMiddleware(req, res, next) {
  // 优先检查 X-Sync-Token header（Hermes 回调拉取）
  const syncTokenHeader = req.headers['x-sync-token'];
  if (syncTokenHeader) {
    try {
      const payload = await verifySyncToken(syncTokenHeader);
      if (!payload) {
        return res.status(401).json({ error: 'sync_token 无效或已过期' });
      }
      // 验证 token 中的 roleId 与 URL 中的 :id 一致
      if (payload.roleId !== req.params.id) {
        return res.status(403).json({ error: 'sync_token 与请求的角色不匹配' });
      }
      // 通过 Role.creatorId 反查 userId
      const role = await prisma.role.findUnique({
        where: { id: req.params.id },
        select: { creatorId: true },
      });
      if (!role) {
        return res.status(404).json({ error: '角色不存在' });
      }
      req.userId = role.creatorId;
      req.authMethod = 'sync_token';
      req.syncTokenPayload = payload;
      return next();
    } catch (err) {
      console.error('sync_token 验证失败:', err);
      return res.status(500).json({ error: '认证失败' });
    }
  }

  // 否则走原有 apiKeyMiddleware（支持 API Key 和 JWT）
  return apiKeyMiddleware(req, res, next);
}

// GET /api/hermes/roles/:id/SOUL.md — 返回 SOUL.md 内容
router.get('/roles/:id/SOUL.md', hermesAuthMiddleware, async (req, res) => {
  try {
    const role = await prisma.role.findUnique({
      where: { id: req.params.id },
      select: { id: true, creatorId: true, displayName: true, soulMd: true },
    });
    if (!role) {
      return res.status(404).json({ error: '角色不存在' });
    }
    if (role.creatorId !== req.userId) {
      return res.status(403).json({ error: '无权访问该角色' });
    }
    if (!role.soulMd) {
      return res.status(404).json({ error: '该角色尚未生成 SOUL.md' });
    }
    res.type('text/plain').send(role.soulMd);
  } catch (err) {
    console.error('获取 SOUL.md 失败:', err);
    res.status(500).json({ error: '服务器错误' });
  }
});

// GET /api/hermes/roles/:id/config.yaml — 返回适配后的 Hermes config.yaml
router.get('/roles/:id/config.yaml', hermesAuthMiddleware, async (req, res) => {
  try {
    const role = await prisma.role.findUnique({
      where: { id: req.params.id },
      select: {
        id: true,
        creatorId: true,
        displayName: true,
        agentId: true,
        model: true,
        temperature: true,
        maxTokens: true,
        enableMemory: true,
        enableTools: true,
      },
    });
    if (!role) {
      return res.status(404).json({ error: '角色不存在' });
    }
    if (role.creatorId !== req.userId) {
      return res.status(403).json({ error: '无权访问该角色' });
    }
    const config = adaptToHermesConfig(role);
    res.type('text/plain').send(config);
  } catch (err) {
    console.error('获取 config.yaml 失败:', err);
    res.status(500).json({ error: '服务器错误' });
  }
});

module.exports = router;
