const FOLDER_PATH = [
  {
    path: "/store/auth/apikey",
    key: "authentication"
  },
  {
    path: "/instances",
    secondaryConnection: true
  },
  { path: "/store/chamaai", key: "chamaai" },
  { path: "/store/chatwoot", key: "chatwoot" },
  { path: "/store/proxy", key: "proxy" },
  { path: "/store/rabbitmq", key: "rabbitmq" },
  { path: "/store/settings", key: "settings" },
  { path: "/store/typebot", key: "typebot" },
  { path: "/store/webhook", key: "webhook" },
  { path: "/store/websocket", key: "websocket" },
]

const fs = require("fs")
const path = require("path")


module.exports = async (instanceName, options, progressBars, conn, connInstance) => {
  var files = []

  FOLDER_PATH.forEach(folder => {
    files = files.concat(getFiles(instanceName, folder))
  })
  const progress = progressBars.create(files.length, 0)
  progress.update({ process: 'Instance' })
  for (const file of files) {
    try {
      const collectionName = file.key || instanceName
      const collection = (!file.secondaryConnection ? conn : connInstance).collection(collectionName)

      var data;
      try {
        data = JSON.parse(fs.readFileSync(file.path, 'utf8'))
      } catch (err) {
        continue;
      }


      if (Array.isArray(data)) continue
      data._id = file.path.split('\\').pop().split('.')[0]
      await collection.findOneAndUpdate({ _id: data._id }, { $set: data }, { upsert: true })
    } catch (err) {
      progress.stop()
      throw { err, file }
    } finally {
      progress.increment()
    }
  }
}

function getFiles(instanceName, opts) {
  var files = []
  const folder = opts.path || opts
  const folderPath = path.join(process.cwd(), folder)

  fs.readdirSync(folderPath).forEach(file => {
    const filePath = path.join(folderPath, file)
    if (fs.statSync(filePath).isDirectory()) {
      files = files.concat(getFiles(instanceName, { ...opts, path: `${folder}/${file}` }))
    } else if (file.includes(instanceName) || opts.path.includes(instanceName)) {
      files.push({ ...opts, path: filePath })
    }
  })
  return files
}