text: 'use strict'
  
  const fs = require('fs-extra')
  const os = require('os')
  const path = require('path')
  const spawnSync = require('./spawn-sync')
  const template = require('lodash.template')
  
  const CONFIG = require('../config')
  
  module.exports = function (packagedAppPath) {
    console.log(`Creating Debian package for "${packagedAppPath}"`)
    const atomExecutableName = CONFIG.channel === 'beta' ? 'atom-beta' : 'atom'
    const apmExecutableName = CONFIG.channel === 'beta' ? 'apm-beta' : 'apm'
    const appName = CONFIG.channel === 'beta' ? 'Atom Beta' : 'Atom'
    const appDescription = CONFIG.appMetadata.description
    const appVersion = CONFIG.appMetadata.version
    let arch
    if (process.arch === 'ia32') {
      arch = 'i386'
    } else if (process.arch === 'x64') {
      arch = 'amd64'
    } else if (process.arch === 'ppc') {
      arch = 'powerpc'
    } else {
      arch = process.arch
    }
  
    const outputDebianPackageFilePath = path.join(CONFIG.buildOutputPath, `atom-${arch}.deb`)
    const debianPackageDirPath = path.join(os.tmpdir(), path.basename(packagedAppPath))
    const debianPackageConfigPath = path.join(debianPackageDirPath, 'DEBIAN')
    const debianPackageInstallDirPath = path.join(debianPackageDirPath, 'usr')
    const debianPackageBinDirPath = path.join(debianPackageInstallDirPath, 'bin')
    const debianPackageShareDirPath = path.join(debianPackageInstallDirPath, 'share')
    const debianPackageAtomDirPath = path.join(debianPackageShareDirPath, atomExecutableName)
    const debianPackageApplicationsDirPath = path.join(debianPackageShareDirPath, 'applications')
    const debianPackageIconsDirPath = path.join(debianPackageShareDirPath, 'pixmaps')
    const debianPackageLintianOverridesDirPath = path.join(debianPackageShareDirPath, 'lintian', 'overrides')
    const debianPackageDocsDirPath = path.join(debianPackageShareDirPath, 'doc', atomExecutableName)
  
    if (fs.existsSync(debianPackageDirPath)) {
      console.log(`Deleting existing build dir for Debian package at "${debianPackageDirPath}"`)
      fs.removeSync(debianPackageDirPath)
    }
    if (fs.existsSync(`${debianPackageDirPath}.deb`)) {
      console.log(`Deleting existing Debian package at "${debianPackageDirPath}.deb"`)
      fs.removeSync(`${debianPackageDirPath}.deb`)
    }
    if (fs.existsSync(debianPackageDirPath)) {
      console.log(`Deleting existing Debian package at "${outputDebianPackageFilePath}"`)
      fs.removeSync(debianPackageDirPath)
    }
  
    console.log(`Creating Debian package directory structure at "${debianPackageDirPath}"`)
    fs.mkdirpSync(debianPackageDirPath)
    fs.mkdirpSync(debianPackageConfigPath)
    fs.mkdirpSync(debianPackageInstallDirPath)
    fs.mkdirpSync(debianPackageShareDirPath)
    fs.mkdirpSync(debianPackageApplicationsDirPath)
    fs.mkdirpSync(debianPackageIconsDirPath)
    fs.mkdirpSync(debianPackageLintianOverridesDirPath)
    fs.mkdirpSync(debianPackageDocsDirPath)
    fs.mkdirpSync(debianPackageBinDirPath)
  
    console.log(`Copying "${packagedAppPath}" to "${debianPackageAtomDirPath}"`)
    fs.copySync(packagedAppPath, debianPackageAtomDirPath)
    fs.chmodSync(debianPackageAtomDirPath, '755')
  
    console.log(`Copying binaries into "${debianPackageBinDirPath}"`)
    fs.copySync(path.join(CONFIG.repositoryRootPath, 'atom.sh'), path.join(debianPackageBinDirPath, atomExecutableName))
    fs.symlinkSync(
      path.join('..', 'share', atomExecutableName, 'resources', 'app', 'apm', 'node_modules', '.bin', 'apm'),
      path.join(debianPackageBinDirPath, apmExecutableName)
    )
  
    console.log(`Writing control file into "${debianPackageConfigPath}"`)
    const packageSizeInKilobytes = spawnSync('du', ['-sk', packagedAppPath]).stdout.toString().split(/\s+/)[0]
    const controlFileTemplate = fs.readFileSync(path.join(CONFIG.repositoryRootPath, 'resources', 'linux', 'debian', 'control.in'))
    const controlFileContents = template(controlFileTemplate)({
      appFileName: atomExecutableName, version: appVersion, arch: arch,
      installedSize: packageSizeInKilobytes, description: appDescription
    })
    fs.writeFileSync(path.join(debianPackageConfigPath, 'control'), controlFileContents)
  
    console.log(`Writing desktop entry file into "${debianPackageApplicationsDirPath}"`)
    const desktopEntryTemplate = fs.readFileSync(path.join(CONFIG.repositoryRootPath, 'resources', 'linux', 'atom.desktop.in'))
    const desktopEntryContents = template(desktopEntryTemplate)({
      appName: appName, appFileName: atomExecutableName, description: appDescription,
      installDir: '/usr', iconPath: atomExecutableName
    })
    fs.writeFileSync(path.join(debianPackageApplicationsDirPath, `${atomExecutableName}.desktop`), desktopEntryContents)
  
    console.log(`Copying icon into "${debianPackageIconsDirPath}"`)
    fs.copySync(
      path.join(packagedAppPath, 'resources', 'app.asar.unpacked', 'resources', 'atom.png'),
      path.join(debianPackageIconsDirPath, `${atomExecutableName}.png`)
    )
  
    console.log(`Copying license into "${debianPackageDocsDirPath}"`)
    fs.copySync(
      path.join(packagedAppPath, 'resources', 'LICENSE.md'),
      path.join(debianPackageDocsDirPath, 'copyright')
    )
  
    console.log(`Copying lintian overrides into "${debianPackageLintianOverridesDirPath}"`)
    fs.copySync(
      path.join(CONFIG.repositoryRootPath, 'resources', 'linux', 'debian', 'lintian-overrides'),
      path.join(debianPackageLintianOverridesDirPath, atomExecutableName)
    )
  
    console.log(`Generating .deb file from ${debianPackageDirPath}`)
    spawnSync('fakeroot', ['dpkg-deb', '-b', debianPackageDirPath], {stdio: 'inherit'})
  
    console.log(`Copying generated package into "${outputDebianPackageFilePath}"`)
    fs.copySync(`${debianPackageDirPath}.deb`, outputDebianPackageFilePath)
  }
  