###
Module dependencies.
###
fs = require 'fs'
dust = require 'dustjs-linkedin'
_ = require 'underscore'
request = require 'request'
Utils = require '../utils'
configureLogger = require '../config/logger'
middlewares = require './middlewares'
urlencode = require 'urlencode'
connectVtexid = require 'connect-vtexid'

class ConnectConcierge

  logger = null
  utils = null

  defaultOptions =
    environment: 'beta'

  constructor: (options) ->
    @options = _.extend({}, defaultOptions, options)
    @options.logger = logger = configureLogger(options).getLogger('connect-concierge')
    @options.utils = utils = new Utils(logger)

  ###########################################
  # SETS CONNECT MIDDLEWARES                #
  ###########################################

  getMiddlewares: (options = exclude: []) =>

    exposedMiddlewares = []

    exposedMiddlewares.push @prepareReq @options          if options.exclude?.indexOf('prepareReq') is -1
    # exposedMiddlewares.push @setLogger @options           if options.exclude?.indexOf('setLogger') is - 1
    exposedMiddlewares.push @checkHosts @options          if options.exclude?.indexOf('checkHosts') is -1
    exposedMiddlewares.push @replaceHost @options         if options.exclude?.indexOf('replaceHost') is -1
    exposedMiddlewares.push @getAccountName @options      if options.exclude?.indexOf('getAccountName') is -1
    exposedMiddlewares.push @getEnvironment @options      if options.exclude?.indexOf('getEnvironment') is -1
    exposedMiddlewares.push connectVtexid @options        if options.exclude?.indexOf('connectVtexid') is -1
    exposedMiddlewares.push @getTags @options             if options.exclude?.indexOf('getTags') is -1
    exposedMiddlewares.push @resolveTags @options         if options.exclude?.indexOf('resolveTags') is -1
    # exposedMiddlewares.push @portalChannelCall @options   if options.exclude?.indexOf('portalChannelCall') is -1
    exposedMiddlewares.push @licenseManagerCall @options  if options.exclude?.indexOf('licenseManagerCall') is -1
    exposedMiddlewares.push @resolveTemplate @options     if options.exclude?.indexOf('resolveTemplate') is -1
    exposedMiddlewares.push @renderTemplate @options      if options.exclude?.indexOf('renderTemplate') is -1
    exposedMiddlewares.push @redirectToLoginPage @options if options.exclude?.indexOf('redirectToLoginPage') is -1

    return exposedMiddlewares

  ###########################################
  # CONNECT MIDDLEWARES                     #
  ###########################################

  prepareReq: (options = {}) ->
    (req, res, next) ->
      req.cookies = utils.parseCookies req
      next()

  setLogger: => new middlewares.SetLogger(@options).handler

  checkHosts: => new middlewares.CheckHosts(@options).handler

  replaceHost: => new middlewares.ReplaceHost(@options).handler

  redirectToKnownHost: => new middlewares.RedirectToKnownHost(@options).handler

  getAccountName: => new middlewares.GetAccountName(@options).handler

  getEnvironment: => new middlewares.GetEnvironment(@options).handler

  getTags: => new middlewares.GetTags(@options).handler

  setIamCookie: => new middlewares.SetIamCookie(@options).handler

  resolveTags: => new middlewares.ResolveTags(@options).handler

  resolveTemplate: => new middlewares.ResolveTemplate(@options).handler

  # portalChannelCall: => new middlewares.PortalChannelCall(@options).handler

  licenseManagerCall: => new middlewares.LicenseManagerCall(@options).handler

  overduePaymentHandler: => new middlewares.OverduePaymentHandler(@options).handler

  renderTemplate: => new middlewares.RenderTemplate(@options).handler

  redirectToLoginPage: => new middlewares.RedirectToLoginPage(@options).handler

module.exports = ConnectConcierge
