#/*
# * 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.
# *
# */

server {
    listen 9000;
    server_name management_gw;

    include /etc/api-gateway/conf.d/commons/common-headers.conf;
    include /etc/api-gateway/conf.d/includes/resolvers.conf;

    # Log locations with service name
    lua_socket_log_errors off;
    access_log /var/log/api-gateway/access.log platform;
    error_log /var/log/api-gateway/management.log debug;

    location /v1/apis {
        access_by_lua_block {
            local apis = require("management/apis")
            local requestMethod = ngx.req.get_method()
            if requestMethod == "GET" then
                apis.getAPIs()
            elseif requestMethod == "PUT" then
                apis.addAPI()
            elseif requestMethod == "POST" then
                apis.addAPI()
            elseif requestMethod == "DELETE" then
                apis.deleteAPI()
            else
                ngx.status = 400
                ngx.say("Invalid verb")
            end
        }
    }

    location /v1/tenants {
        access_by_lua_block {
            local tenants = require("management/tenants")
            local requestMethod = ngx.req.get_method()
            if requestMethod == "GET" then
                tenants.getTenants()
            elseif requestMethod == "PUT" then
                tenants.addTenant()
            elseif requestMethod == "POST" then
                tenants.addTenant()
            elseif requestMethod == "DELETE" then
                tenants.deleteTenant()
            else
                ngx.status = 400
                ngx.say("Invalid verb")
            end
        }
    }

    location /v1/subscriptions {
         access_by_lua_block {
             local subscriptions = require("management/subscriptions")
             local requestMethod = ngx.req.get_method()
             if requestMethod == "PUT" then
                 subscriptions.addSubscription()
             elseif requestMethod == "DELETE" then
                 subscriptions.deleteSubscription()
             else
                 ngx.status = 400
                 ngx.say("Invalid verb")
             end
         }
    }

    location /v1/subscribe {
        access_by_lua_block {
            local requestMethod = ngx.req.get_method()
            if requestMethod == "GET" then
                local redis = require "lib/redis"
                local logger = require "lib/logger"
                local utils = require "lib/utils"
                local REDIS_HOST = os.getenv("REDIS_HOST")
                local REDIS_PORT = os.getenv("REDIS_PORT")
                local REDIS_PASS = os.getenv("REDIS_PASS")
                redis.init(REDIS_HOST, REDIS_PORT, REDIS_PASS)
                logger.info(utils.concatStrings({"Connected to redis at ", REDIS_HOST, ":", REDIS_PORT}))
                while true do end
            else
                ngx.say("Invalid verb")
            end
        }
    }

    location /v1/health-check {
        access_by_lua_block {
            local requestMethod = ngx.req.get_method()
            if requestMethod == "GET" then
                local request = require "lib/request"
                request.success(200,  "Status: Gateway ready.")
            else
                ngx.say("Invalid verb")
            end
        }
    }
}
