// 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.Errorf(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)
	}
}
