-- Copyright (c) 2016 IBM. All rights reserved.
--
--   Permission is hereby granted, free of charge, to any person obtaining a
--   copy of this software and associated documentation files (the "Software"),
--   to deal in the Software without restriction, including without limitation
--   the rights to use, copy, modify, merge, publish, distribute, sublicense,
--   and/or sell copies of the Software, and to permit persons to whom the
--   Software is furnished to do so, subject to the following conditions:
--
--   The above copyright notice and this permission notice shall be included in
--   all copies or substantial portions of the Software.
--
--   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
--   IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
--   FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
--   AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
--   LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
--   FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
--   DEALINGS IN THE SOFTWARE.

--- @module filemgmt
-- Creates the Nginx Conf files
-- @author Alex Song (songs), David Green (greend)

local utils = require "lib/utils"
local cjson = require "cjson"
local request = require "lib/request"

local _M = {}

--- Create/overwrite Nginx Conf file for given resource
-- @param baseConfDir the base directory for storing conf files for managed resources
-- @param tenant the namespace for the resource
-- @param gatewayPath the gateway path of the resource
-- @param resourceObj object containing different operations/policies for the resource
-- @return fileLocation location of created/updated conf file
function _M.createResourceConf(baseConfDir, tenant, gatewayPath, resourceObj)
  local decoded = cjson.decode(resourceObj)
  resourceObj = utils.serializeTable(decoded)
  local prefix = utils.concatStrings({"\tinclude /etc/api-gateway/conf.d/commons/common-headers.conf;\n",
                                      "\tset $upstream https://172.17.0.1;\n",
                                      "\tset $tenant ", tenant, ";\n",
                                      "\tset $backendUrl '';\n",
                                      "\tset $gatewayPath ",  utils.concatStrings({"\"", ngx.unescape_uri(gatewayPath),
                                      "\""}), ";\n\n"})
  if decoded.apiId ~= nil then
    prefix = utils.concatStrings({prefix, "\tset $apiId ", decoded.apiId, ";\n"})
  end
  -- Set resource headers and mapping by calling routing.processCall()
  local outgoingResource = utils.concatStrings({"\taccess_by_lua_block {\n",
                                                "\t\tlocal routing = require \"routing\"\n",
                                                "\t\trouting.processCall(", resourceObj, ")\n",
                                                "\t}\n\n",
                                                "\tproxy_pass $upstream;\n"})
  -- Add to endpoint conf file
  os.execute(utils.concatStrings({"mkdir -p ", baseConfDir, tenant}))
  local fileLocation = utils.concatStrings({baseConfDir, tenant, "/", gatewayPath, ".conf"})
  local file, err = io.open(fileLocation, "w")
  if not file then
    request.err(500, utils.concatStrings({"Error adding to endpoint conf file: ", err}))
  end

  local updatedPath = ngx.unescape_uri(gatewayPath):gsub("%{(%w*)%}", utils.convertTemplatedPathParam)

  local location = utils.concatStrings({"location ~ ^/api/", tenant, "/", updatedPath, "(\\b) {\n",
                                        prefix,
                                        outgoingResource,
                                        "}\n"})
  file:write(location)
  file:close()
  -- reload nginx to refresh conf files
  os.execute("/usr/local/sbin/nginx -s reload")
  return fileLocation
end

--- Delete Ngx conf file for given resource
-- @param baseConfDir the base directory for storing conf files for managed resources
-- @param tenant the namespace for the resource
-- @param gatewayPath the gateway path of the resource
-- @return fileLocation location of deleted conf file
function _M.deleteResourceConf(baseConfDir, tenant, gatewayPath)
  local fileLocation = utils.concatStrings({baseConfDir, tenant, "/", gatewayPath, ".conf"})
  os.execute(utils.concatStrings({"rm -f ", fileLocation}))
  -- reload nginx to refresh conf files
  os.execute("/usr/local/sbin/nginx -s reload")
  return fileLocation
end

return _M
