const jwt = require('jsonwebtoken');
const crypto = require('crypto');
const prisma = require('./prisma');

const SYNC_TOKEN_EXPIRES_IN = '5m';

// 从 SystemConfig 获取 SYNC_SECRET，不存在则自动生成
async function getSyncSecret() {
  let config = await prisma.systemConfig.findUnique({ where: { key: 'SYNC_SECRET' } });
  if (!config) {
    const secret = crypto.randomBytes(32).toString('hex');
    config = await prisma.systemConfig.create({
      data: { key: 'SYNC_SECRET', value: secret },
    });
  }
  return config.value;
}

// 生成 sync_token（5 分钟过期，jti 用 CSPRNG 生成）
async function generateSyncToken(roleId, adminId) {
  const secret = await getSyncSecret();
  const jti = crypto.randomBytes(16).toString('hex');
  return jwt.sign({ roleId, adminId, jti, type: 'sync' }, secret, { expiresIn: SYNC_TOKEN_EXPIRES_IN });
}

// 验证 sync_token，返回 payload 或 null
// 注意：sync_token 在 5 分钟有效期内可多次使用（Hermes 需拉取 SOUL.md + config.yaml 两个文件）
// 重放防护依赖 5 分钟短过期 + HTTPS 传输 + roleId 绑定
async function verifySyncToken(token) {
  try {
    const secret = await getSyncSecret();
    const decoded = jwt.verify(token, secret);
    if (decoded.type !== 'sync') return null;
    return decoded;
  } catch {
    return null;
  }
}

module.exports = {
  generateSyncToken,
  verifySyncToken,
};
