{

let userHome

const handleNeutralinoError = err => {
  throw new Error(err.code + ': ' + err.message)
}

const mapDirent = ({ entry, type }) => ({
  name: entry,
  type
})

window.Platform = {
  //
  // Paths
  //

  dirname(path) {
    let normalPath = this.normalize(path)
    let index = normalPath.lastIndexOf('/')

    return index === -1 ? '' : normalPath.slice(0, index)
  },

  filename(path) {
    let index = path.lastIndexOf('/')

    return index === -1 ? path : path.slice(index + 1)
  },

  ext(path) {
    let filename = this.filename(path)
    let index = filename.lastIndexOf('.')
    
    return index === -1 ? '' : filename.slice(index + 1)
  },

  join(...args) {
    let parts = []

    for(let arg of args) {
      parts = parts.concat(arg.split('/'))
    }

    return this.normalizePathFromParts(parts)
  },

  // TODO: support non-posix
  absolute(path) {
    return path.charAt(0) === '/'
  },

  normalize(path) {
    return this.normalizePathFromParts(path.split('/'))
  },

  normalizePathFromParts(parts) {
    // let newPath = path !== '/' && path.endsWith('/') ?
    //   path.slice(0, -1) :
    //   path

    let out = []
    let skips = 0

    for(let i = parts.length - 1; i >= 0; i--) {
      let part = parts[i]

      if(part.length == 0 || part === '.') {
        continue
      } else if(part == '..') {
        skips++
        continue
      } else if(skips == 0) {
        out.unshift(part)
      } else {
        skips--
      }
    }

    console.log(out)

    return '/' + out.join('/')
  },

  //
  // FS
  //

  async access(path) {
    try {
      await Neutralino.filesystem.getStats(path)
      return
    } catch(err) {
      if(err.name = 'NE_FS_NOPATHE') {
        return false
      } else {
        throw err
      }
    }
  },

  writeText(path, content) {
    return Neutralino.filesystem.writeFile(path, content)
      .catch(handleNeutralinoError)
  },

  readText(path) {
    return Neutralino.filesystem.readFile(path)
      .catch(handleNeutralinoError)
  },

  readdir(path) {
    return Neutralino.filesystem.readDirectory(path)
      .catch(handleNeutralinoError)
      .then(dirents => dirents.map(mapDirent))
  },

  //
  // OS
  //
  async getHome() {
    return userHome ?? (userHome = await Neutralino.os.getEnv('HOME'))
  },
}

}