text: var debug = require('debug')('ghost:admin'),
      config = require('../config'),
      express = require('express'),
      adminHbs = require('express-hbs').create(),
  
      // Admin only middleware
      redirectToSetup = require('../middleware/redirect-to-setup'),
  
      // Global/shared middleware?
      cacheControl = require('../middleware/cache-control'),
      urlRedirects = require('../middleware/url-redirects'),
      errorHandler = require('../middleware/error-handler'),
      maintenance = require('../middleware/maintenance'),
      prettyURLs = require('../middleware/pretty-urls'),
      serveStatic = require('express').static,
      utils = require('../utils');
  
  module.exports = function setupAdminApp() {
      debug('Admin setup start');
      var adminApp = express();
  
      // First determine whether we're serving admin or theme content
      // @TODO finish refactoring this away.
      adminApp.use(function setIsAdmin(req, res, next) {
          res.isAdmin = true;
          next();
      });
  
      // @TODO replace all this with serving ember's index.html
      // Create a hbs instance for admin and init view engine
      adminApp.set('view engine', 'hbs');
      adminApp.set('views', config.get('paths').adminViews);
      adminApp.engine('hbs', adminHbs.express3({}));
      // Register our `asset` helper
      adminHbs.registerHelper('asset', require('../helpers/asset'));
  
      // Admin assets
      // @TODO ensure this gets a local 404 error handler
      adminApp.use('/assets', serveStatic(
          config.get('paths').clientAssets,
          {maxAge: utils.ONE_YEAR_MS, fallthrough: false}
      ));
  
      // Service Worker for offline support
      adminApp.get(/^\/(sw.js|sw-registration.js)$/, require('./serviceworker'));
  
      // Render error page in case of maintenance
      adminApp.use(maintenance);
  
      // Force SSL if required
      // must happen AFTER asset loading and BEFORE routing
      adminApp.use(urlRedirects);
  
      // Add in all trailing slashes & remove uppercase
      // must happen AFTER asset loading and BEFORE routing
      adminApp.use(prettyURLs);
  
      // Cache headers go last before serving the request
      // Admin is currently set to not be cached at all
      adminApp.use(cacheControl('private'));
      // Special redirects for the admin (these should have their own cache-control headers)
      adminApp.use(redirectToSetup);
  
      // Finally, routing
      adminApp.get('*', require('./controller'));
  
      adminApp.use(errorHandler.pageNotFound);
      adminApp.use(errorHandler.handleHTMLResponse);
  
      debug('Admin setup end');
  
      return adminApp;
  };
  