-- 
-- Licensed to the Apache Software Foundation (ASF) under one or more
-- contributor license agreements.  See the NOTICE file distributed with
-- this work for additional information regarding copyright ownership.
-- The ASF licenses this file to You under the Apache License, Version 2.0
-- (the "License"); you may not use this file except in compliance with
-- the License.  You may obtain a copy of the License at
-- 
--    http://www.apache.org/licenses/LICENSE-2.0
-- 
-- Unless required by applicable law or agreed to in writing, software
-- distributed under the License is distributed on an "AS IS" BASIS,
-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-- See the License for the specific language governing permissions and
-- limitations under the License.
-- 

local Tracer = {}

function Tracer:start(upstream_name)
    local metadata_buffer = ngx.shared.tracing_buffer
    local TC = require('tracing_context')
    local Layer = require('span_layer')

    local tracingContext
    local serviceName = metadata_buffer:get("serviceName")
    local serviceInstId = metadata_buffer:get("serviceInstId")
    local serviceId = metadata_buffer:get('serviceId')
    if (serviceInstId ~= nil and serviceInstId ~= 0) then
        tracingContext = TC:new(serviceId, serviceInstId)
    else
        tracingContext = TC:newNoOP()
    end

    -- Constant pre-defined in SkyWalking main repo
    -- 84 represents Nginx
    local nginxComponentId = 6000

    local contextCarrier = {}
    contextCarrier["sw6"] = ngx.req.get_headers()["sw6"]
    local entrySpan = tracingContext:createEntrySpan(ngx.var.uri, nil, contextCarrier)
    entrySpan:start(ngx.now() * 1000)
    entrySpan:setComponentId(nginxComponentId)
    entrySpan:setLayer(Layer.HTTP)
    
    entrySpan:tag('http.method', ngx.req.get_method())
    entrySpan:tag('http.params', ngx.var.scheme .. '://' .. ngx.var.host .. ngx.var.request_uri )
    
    contextCarrier = {}
    -- Use the same URI to represent incoming and forwarding requests
    -- Change it if you need.
    local upstreamUri = ngx.var.uri

    local upstreamServerName = upstream_name
    ------------------------------------------------------
    local exitSpan = tracingContext:createExitSpan(upstreamUri, entrySpan, upstreamServerName, contextCarrier)
    exitSpan:start(ngx.now() * 1000)
    exitSpan:setComponentId(nginxComponentId)
    exitSpan:setLayer(Layer.HTTP)
    
    for name, value in pairs(contextCarrier) do
        ngx.req.set_header(name, value)
    end

    -- Push the data in the context
    ngx.ctx.tracingContext = tracingContext
    ngx.ctx.entrySpan = entrySpan
    ngx.ctx.exitSpan = exitSpan
end

function Tracer:finish()
    -- Finish the exit span when received the first response package from upstream
    if ngx.ctx.exitSpan ~= nil then
        ngx.ctx.exitSpan:finish(ngx.now() * 1000)
        ngx.ctx.exitSpan = nil
    end
end

function Tracer:prepareForReport()
    if ngx.ctx.entrySpan ~= nil then
        ngx.ctx.entrySpan:finish(ngx.now() * 1000)
        local status, segment = ngx.ctx.tracingContext:drainAfterFinished()
        if status then
            local segmentJson = require('cjson').encode(segment:transform())
            ngx.log(ngx.DEBUG, 'segment = ' .. segmentJson)

            local queue = ngx.shared.tracing_buffer
            local length = queue:lpush('segment', segmentJson)
            ngx.log(ngx.DEBUG, 'segment buffer size = ' .. queue:llen('segment'))
        end
    end
end

return Tracer