const fs = require('fs-plus')
const path = require('path')

const hasWriteAccess = (dir) => {
  const testFilePath = path.join(dir, 'write.test')
  try {
    fs.writeFileSync(testFilePath, new Date().toISOString(), { flag: 'w+' })
    fs.unlinkSync(testFilePath)
    return true
  } catch (err) {
    return false
  }
}

const getAppDirectory = () => {
  switch (process.platform) {
    case 'darwin':
      return process.execPath.substring(0, process.execPath.indexOf('.app') + 4)
    case 'linux':
    case 'win32':
      return path.join(process.execPath, '..')
  }
}

module.exports = {
  setAtomHome: (homePath) => {
    // When a read-writeable .atom folder exists above app use that
    const portableHomePath = path.join(getAppDirectory(), '..', '.atom')
    if (fs.existsSync(portableHomePath)) {
      if (hasWriteAccess(portableHomePath)) {
        process.env.ATOM_HOME = portableHomePath
      } else {
        // A path exists so it was intended to be used but we didn't have rights, so warn.
        console.log(`Insufficient permission to portable Atom home "${portableHomePath}".`)
      }
    }

    // Check ATOM_HOME environment variable next
    if (process.env.ATOM_HOME !== undefined) {
      return
    }

    // Fall back to default .atom folder in users home folder
    process.env.ATOM_HOME = path.join(homePath, '.atom')
  },

  setUserData: (app) => {
    const electronUserDataPath = path.join(process.env.ATOM_HOME, 'electronUserData')
    if (fs.existsSync(electronUserDataPath)) {
      if (hasWriteAccess(electronUserDataPath)) {
        app.setPath('userData', electronUserDataPath)
      } else {
        // A path exists so it was intended to be used but we didn't have rights, so warn.
        console.log(`Insufficient permission to Electron user data "${electronUserDataPath}".`)
      }
    }
  },

  getAppDirectory: getAppDirectory
}
