-- 
-- 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 spanLayer = require("span_layer")
local Util = require('util')
local SegmentRef = require("segment_ref")

local CONTEXT_CARRIER_KEY = 'sw6'

local Span = {
    span_id,
    parent_span_id,
    operation_name,
    tags,
    logs,
    layer = spanLayer.NONE,
    is_entry = false,
    is_exit = false,
    peer,
    start_time,
    end_time,
    error_occurred = false,
    component_id,
    refs,
    is_noop = false,
    -- owner is a TracingContext reference
    owner,
}

-- Due to nesting relationship inside Segment/Span/TracingContext at the runtime,
-- SpanProtocol is created to prepare JSON format serialization.
-- Following SkyWalking official trace protocol v2
-- https://github.com/apache/skywalking-data-collect-protocol/blob/master/language-agent-v2/trace.proto
local SpanProtocol = {
    spanId,
    parentSpanId,
    startTime,
    endTime,
    -- Array of RefProtocol
    refs,
    operationName,
    peer,
    spanType,
    spanLayer,
    componentId,
    isError,
    tags,
    logs,
}

-- Create an entry span. Represent the HTTP incoming request.
-- @param contextCarrier, HTTP request header, which could carry the `sw6` context
function Span:createEntrySpan(operationName, context, parent, contextCarrier)
    local span = self:new(operationName, context, parent)
    span.is_entry = true

    if contextCarrier ~= nil then
        local propagatedContext = contextCarrier[CONTEXT_CARRIER_KEY]
        if propagatedContext ~= nil then
            local ref = SegmentRef:new():fromSW6Value(propagatedContext)
            if ref ~= nil then
                -- If current trace id is generated by the context, in LUA case, mostly are yes
                -- use the ref trace id to override it, in order to keep trace id consistently same.
                context.internal:addRefIfFirst(ref)
                span.refs[#span.refs + 1] = ref
            end
        end
    end

    return span
end

-- Create an exit span. Represent the HTTP outgoing request.
function Span:createExitSpan(operationName, context, parent, peer, contextCarrier)
    local span = self:new(operationName, context, parent)
    span.is_exit = true
    span.peer = peer

    if contextCarrier ~= nil then
        -- if there is contextCarrier container, the Span will inject the value based on the current tracing context
        local injectableRef = SegmentRef:new()
        injectableRef.trace_id = context.trace_id
        injectableRef.segment_id = context.segment_id
        injectableRef.span_id = span.span_id
        -- injectableRef.network_address_id wouldn't be set. Right now, there is no network_address register mechanism
        injectableRef.network_address = peer

        local entryServiceInstanceId
        local entryEndpointName
        -- -1 represent the endpoint id doesn't exist, but it is a meaningful value.
        -- Once -1 is here, the entryEndpointName will be ignored.
        local entryEndpointId = -1

        local firstSpan = context.internal.first_span
        if context.internal:hasRef() then
            local firstRef = context.internal:getFirstRef()
            injectableRef.entry_service_instance_id = firstRef.entry_service_instance_id
            entryEndpointName = firstRef.entry_endpoint_name
            entryEndpointId = firstRef.entry_endpoint_id
            entryServiceInstanceId = firstRef.entry_service_instance_id
        else
            injectableRef.entry_service_instance_id = context.service_inst_id
            if firstSpan.is_entry then
                entryEndpointId = 0
                entryEndpointName = firstSpan.operation_name
            end
            entryServiceInstanceId = context.service_inst_id
        end
        
        injectableRef.entry_service_instance_id = entryServiceInstanceId
        injectableRef.parent_service_instance_id = context.service_inst_id
        injectableRef.entry_endpoint_name = entryEndpointName
        injectableRef.entry_endpoint_id = entryEndpointId

        local parentEndpointName
        local parentEndpointId = -1
        
        if firstSpan.is_entry then
            parentEndpointName = firstSpan.operation_name
            parentEndpointId = 0
        end
        injectableRef.parent_endpoint_name = parentEndpointName
        injectableRef.parent_endpoint_id = parentEndpointId

        contextCarrier[CONTEXT_CARRIER_KEY] = injectableRef:serialize()
    end

    return span
end

-- Create an local span. Local span is usually not used. 
-- Typically, only one entry span and one exit span in the Nginx tracing segment.
function Span:createLocalSpan(operationName, context, parent)
    local span = self:new(operationName, context, parent) 
    return span
end

-- Create a default span.
-- Usually, this method wouldn't be called by outside directly.
-- Read newEntrySpan, newExitSpan and newLocalSpan for more details
function Span:new(operationName, context, parent)
    local o = {}
    setmetatable(o, self)
    self.__index = self

    o.operation_name = operationName
    o.span_id = context.internal:nextSpanID()
    
    if parent == nil then
        -- As the root span, the parent span id is -1
        o.parent_span_id = -1
    else
        o.parent_span_id = parent.span_id
    end 

    context.internal:addActive(o)
    -- o.start_time = Util.timestamp()
    o.refs = {}
    o.owner = context

    return o
end

function Span:newNoOP()
    local o = {}
    setmetatable(o, self)
    self.__index = self

    o.is_noop = true
    return o
end

function SpanProtocol:new()
    local o = {}
    setmetatable(o, self)
    self.__index = self

    return o
end

---- All belowing are instance methods

-- Set start time explicitly
function Span:start(startTime)
    if self.is_noop then
        return self
    end

    self.start_time = startTime

    return self
end

function Span:finishWithDuration(duration)
    if self.is_noop then
        return self
    end

    self:finish(self.start_time + duration)
    
    return self
end

-- @param endTime, optional.
function Span:finish(endTime)
    if self.is_noop then
        return self
    end

    if endTime == nil then
        self.end_time = Util.timestamp()
    else
        self.end_time = endTime
    end
    self.owner.internal:finishSpan(self)

    return self
end

function Span:setComponentId(componentId)
    if self.is_noop then
        return self
    end
    self.component_id = componentId

    return self
end

function Span:setLayer(spanLayer)
    if self.is_noop then
        return self
    end
    self.layer = spanLayer

    return self
end

function Span:errorOccurred()
    if self.is_noop then
        return self
    end
    self.error_occurred = true

    return self
end

function Span:tag(tagKey, tagValue)
    if self.is_noop then
        return self
    end

    if self.tags == nil then
        self.tags = {}
    end

    local tag = {key = tagKey, value = tagValue}
    self.tags[#self.tags + 1] = tag

    return self
end

-- @param keyValuePairs, keyValuePairs is a typical {key=value, key1=value1}
function Span:log(timestamp, keyValuePairs)
    if self.is_noop then
        return self
    end

    if self.logs == nil then
        self.logs = {}
    end

    local logEntity = {time = timestamp, data = keyValuePairs}
    self.logs[#self.logs + 1] = logEntity

    return self
end

-- Return SpanProtocol
function Span:transform()
    local spanBuilder = SpanProtocol:new()
    spanBuilder.spanId = self.span_id
    spanBuilder.parentSpanId = self.parent_span_id
    spanBuilder.startTime = self.start_time
    spanBuilder.endTime = self.end_time
    -- Array of RefProtocol
    if #self.refs > 0 then
        spanBuilder.refs = {}
        for i, ref in ipairs(self.refs)
        do 
            spanBuilder.refs[#spanBuilder.refs + 1] = ref:transform()
        end
    end

    spanBuilder.operationName = self.operation_name
    spanBuilder.peer = self.peer
    if self.is_entry then
        spanBuilder.spanType = 'Entry'
    elseif self.is_exit then
        spanBuilder.spanType = 'Exit'
    else
        spanBuilder.spanType = 'Local'
    end
    if self.layer ~= spanLayer.NONE then
        spanBuilder.spanLayer = self.layer.name
    end
    spanBuilder.componentId = self.component_id
    spanBuilder.isError = self.error_occurred

    spanBuilder.tags = self.tags
    spanBuilder.logs = self.logs

    return spanBuilder
end

return Span
