const discordManager = require('../discord/discordManager')
const newsAnnounce = require('../discord/newsAnnounce')
const createLogger = require('../utils/logger')

const log = createLogger('internal')

// POST /internal/config — called by the main server right after an admin
// saves the Discord Bot panel, and by the bot's own bootstrap on startup
// (via a GET to the server for the current config, then this same start/stop
// logic locally). Body: { token, guildId, enabled }.
async function setConfig(req, res) {
  const { token, guildId, enabled } = req.body || {}
  try {
    if (enabled) {
      if (!token || !guildId) {
        return res.status(400).json({ message: 'token and guildId are required when enabled' })
      }
      await discordManager.start({ token, guildId })
    } else {
      await discordManager.stop()
    }
    return res.json(discordManager.getStatus())
  } catch (err) {
    log.error('setConfig failed', { message: err.message })
    // Still 200 with an error status — the caller (admin panel) should surface
    // discordManager's status/statusDetail rather than treat this as a 5xx.
    return res.json(discordManager.getStatus())
  }
}

// GET /internal/status — live connection state, polled by the admin panel.
function getStatusHandler(req, res) {
  return res.json(discordManager.getStatus())
}

// POST /internal/announce — called by the main server right after a news
// post is published. Body: { title, excerpt, url, imageUrl }.
async function announce(req, res) {
  const connection = discordManager.getConnection()
  if (!connection) return res.status(503).json({ message: 'Bot is not connected' })
  try {
    await newsAnnounce.postAnnounce(connection.client, connection.guildId, req.body || {})
    return res.json({ posted: true })
  } catch (err) {
    log.warn('announce failed', { message: err.message })
    return res.status(400).json({ message: err.message })
  }
}

module.exports = { setConfig, getStatus: getStatusHandler, announce }
