// Package tracer provides an interface for distributed tracing
package tracer

import (
	"context"
)

// DefaultTracer is the global default tracer
var DefaultTracer Tracer = NewTracer()

// Tracer is an interface for distributed tracing
type Tracer interface {
	// Name return tracer name
	Name() string
	// Init tracer with options
	Init(...Option) error
	// Start a trace
	Start(ctx context.Context, name string, opts ...SpanOption) (context.Context, Span)
}

type Span interface {
	// Tracer return underlining tracer
	Tracer() Tracer
	// Finish complete and send span
	Finish(opts ...SpanOption)
	// AddEvent add event to span
	AddEvent(name string, opts ...EventOption)
	// Context return context with span
	Context() context.Context
	// SetName set the span name
	SetName(name string)
	// SetLabels set the span labels
	SetLabels(labels ...Label)
}

type Label struct {
	val interface{}
	key string
}

func Any(k string, v interface{}) Label {
	return Label{key: k, val: v}
}

func String(k string, v string) Label {
	return Label{key: k, val: v}
}

func Int(k string, v int) Label {
	return Label{key: k, val: v}
}

func Int64(k string, v int64) Label {
	return Label{key: k, val: v}
}

func Float64(k string, v float64) Label {
	return Label{key: k, val: v}
}

func Bool(k string, v bool) Label {
	return Label{key: k, val: v}
}