#/*
# * 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 main;
    error_log /var/log/api-gateway/management.log debug;

    location ~ /(?<version>v2)/(?<tenantId>[^/]*)/apis/?(?<api_id>[^/]*)?/?(?<query>[^/]*)? {
        access_by_lua_block {
            local ds = require('lib/dataStore')
            local dataStore = ds.init() 
            local apis = require("management/routes/apis")
            apis.requestHandler(dataStore)
        }
    }

    location ~ /(?<version>v1)/apis/?(?<api_id>[^/]*)?/?(?<query>[^/]*)? {
        access_by_lua_block {
            local apis = require("management/routes/apis")
            local ds = require('lib/dataStore')
            local dataStore = ds.init() 
            apis.requestHandler(dataStore)
        }
    }

    location ~ /v1/tenants/?(?<tenant_id>[^/]*)?/?(?<query>[^/]*)? {
        access_by_lua_block {
            local tenants = require("management/routes/tenants")
            local ds = require('lib/dataStore')
            local dataStore = ds.init() 
            tenants.requestHandler(dataStore)
        }
    }
    
    location ~ /(?<version>v2)/(?<tenant_id>[^/]*)/subscriptions/?(?<client_id>[^/]*)?/? {
        access_by_lua_block {
            local subscriptions = require("management/routes/subscriptions")
            local ds = require('lib/dataStore')
            local dataStore = ds.init()
            subscriptions.requestHandler(dataStore)
        }
    }
    
    location ~ /(?<version>v1)/subscriptions/? {
        access_by_lua_block {
            local subscriptions = require("management/routes/subscriptions")
            local ds = require('lib/dataStore')
            local dataStore = ds.init()
            subscriptions.requestHandler(dataStore)
        }
    }

    location /v1/health-check {
        access_log off;
        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
        }
    }
}
