# Author: VTEX

_ = require 'underscore'
dust = require 'dustjs-linkedin'

class RenderTemplate

  constructor: (options) ->
    @options = options

  ########################
  # Handler              #
  ########################

  handler: (req, res, next) =>
    @options.logger?.debug('RenderTemplate middleware')
    return next() if @options.utils.isAdmin(req, @options) is false
    return next() if req.url.indexOf('/admin/logout') isnt -1
    return next() if req.url.indexOf('/admin/login') isnt -1 and process.env.NODE_ENV is 'development'
    return next(new Error('req.template is required')) if not req.template?

    @options.dustContext = {} if not @options.dustContext?
    req.dustContext = {} if not req.dustContext?
    tags = req.tags
    dustContext = _.extend @options.dustContext, req.dustContext, tags: tags, req.vtex

    @options.utils.startDustHelpers dust, req

    template = req.template
    compiled = dust.compile template, 'template'
    dust.loadSource compiled

    @options.logger?.info 'Rendering template'
    dust.render 'template', dustContext, (err, out) =>

      # ADDS GTM TO ALL RESPONSES
      headTagIndex = out.indexOf('<head>') + '<head>'.length;
      beforeHead = out.substr(0, headTagIndex)
      afterHead = out.substr(headTagIndex)
      gtmCode = "<script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':\n" +
        "new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],\n" +
        "j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=\n" +
        "'//www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);\n" +
        "})(window,document,'script','dataLayer','GTM-MB9QMPT');</script>"
      outWithGTM = if headTagIndex isnt -1 then (beforeHead + gtmCode + afterHead) else out

      return @options.logger?.error err  if err
      res.setHeader 'Content-Type', 'text/html'
      res.end @options.utils.minifyString(outWithGTM)

module.exports = RenderTemplate
