// 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 eventtest supports logging events to a test.
// You can use NewContext to create a context that knows how to deliver
// telemetry events back to the test.
// You must use this context or a derived one anywhere you want telemetry to be
// correctly routed back to the test it was constructed with.
package eventtest

import (
	"context"
	"os"
	"testing"
	"time"

	"github.com/google/go-cmp/cmp"
	"github.com/google/go-cmp/cmp/cmpopts"
	"golang.org/x/exp/event"
	"golang.org/x/exp/event/adapter/logfmt"
)

// NewContext returns a context you should use for the active test.
func NewContext(ctx context.Context, tb testing.TB) context.Context {
	h := &testHandler{tb: tb}
	return event.WithExporter(ctx, event.NewExporter(h, nil))
}

type testHandler struct {
	tb      testing.TB
	printer logfmt.Printer
}

func (h *testHandler) Event(ctx context.Context, ev *event.Event) context.Context {
	//TODO: choose between stdout and stderr based on the event
	//TODO: decide if we should be calling h.tb.Fail()
	h.printer.Event(os.Stdout, ev)
	return ctx
}

var InitialTime = func() time.Time {
	t, _ := time.Parse(logfmt.TimeFormat, "2020/03/05 14:27:48")
	return t
}()

func ExporterOptions() *event.ExporterOptions {
	nextTime := InitialTime
	return &event.ExporterOptions{
		Now: func() time.Time {
			thisTime := nextTime
			nextTime = nextTime.Add(time.Second)
			return thisTime
		},
	}
}

func CmpOption() cmp.Option {
	return cmpopts.IgnoreFields(event.Event{}, "At", "ctx", "target", "labels")
}
