// Copyright 2020 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package dcensus

import (
	"bytes"
	"context"
	"fmt"
	"io"
	"sync"

	"go.opencensus.io/trace"
	"golang.org/x/pkgsite/internal/log"
)

type debugTraceExporter struct {
	exp trace.Exporter
	mu  sync.Mutex
	err error
}

func (d *debugTraceExporter) onError(err error) {
	log.Debugf(context.Background(), "trace exporter: onError called with %v", err)
	d.err = err
}

// ExportSpan implements the trace.Exporter interface.
func (d *debugTraceExporter) ExportSpan(s *trace.SpanData) {
	ctx := context.Background()
	d.mu.Lock()
	d.exp.ExportSpan(s)
	err := d.err
	d.err = nil
	d.mu.Unlock()
	if err != nil {
		log.Warningf(ctx, "trace exporter: %v", err)
		log.Debugf(ctx, "trace exporter SpanData:\n%s", dumpSpanData(s))
	}
}

func dumpSpanData(s *trace.SpanData) string {
	var buf bytes.Buffer
	fmt.Fprintf(&buf, "Name: %q\n", s.Name)
	dumpAttributes(&buf, s.Attributes)
	for _, a := range s.Annotations {
		fmt.Fprintf(&buf, "  annotation: %q\n", a.Message)
		dumpAttributes(&buf, a.Attributes)
	}
	fmt.Fprintf(&buf, "Status.Message: %q\n", s.Status.Message)
	fmt.Fprintln(&buf, "link attrs:")
	for _, l := range s.Links {
		dumpAttributes(&buf, l.Attributes)
	}
	return buf.String()
}

func dumpAttributes(w io.Writer, m map[string]interface{}) {
	for k, v := range m {
		fmt.Fprintf(w, "  %q: %#v\n", k, v)
	}
}
