import { Message } from "../api/messages/models"
import helpers from "../utils/helpers"

const BATCH_SIZE = 100

async function execute() {
  let skip = 0
  let totalEncrypted = 0

  while (true) {
    const messages = await Message.find({ content: { $exists: true, $ne: null } })
      .select('_id content')
      .skip(skip)
      .limit(BATCH_SIZE)
      .lean()

    if (messages.length === 0) break

    const bulkOps = messages
      .filter((msg) => {
        try {
          helpers.decryptAes(msg.content!)
          return false // already encrypted, skip
        } catch {
          return true // not encrypted, include
        }
      })
      .map((msg) => ({
        updateOne: {
          filter: { _id: msg._id },
          update: { $set: { content: helpers.encryptAes(msg.content!) } }
        }
      }))

    if (bulkOps.length > 0) await Message.bulkWrite(bulkOps)

    totalEncrypted += messages.length
    console.log(`Encrypted ${totalEncrypted} messages...`)

    if (messages.length < BATCH_SIZE) break
    skip += BATCH_SIZE
  }

  console.log(`Done. Total encrypted: ${totalEncrypted}`)
}

const scriptEncryptAllMessages = {
  execute
}

export default scriptEncryptAllMessages
