package auditlog

import (
	"context"
	"testing"
	"time"

	"github.com/smartystreets/goconvey/convey"
)

func TestEventBuilder(t *testing.T) {
	ctx := context.TODO()
	InitMockAuditLogSDK(ctx, time.Second) //nolint:errcheck

	convey.Convey("TestEventBuilder", t, func() {
		convey.Convey("NewEvent submit without anything", func() {
			err := NewEvent(ctx, EventImportDataFromAWS).Submit()
			convey.So(err, convey.ShouldNotBeNil)
		})

		convey.Convey("user token not found", func() {
			err := NewEvent(ctx, EventActivation).Submit()
			convey.So(err, convey.ShouldEqual, errTokenNotFound)
		})

		convey.Convey("api pubkey set", func() {
			err := NewEvent(ctx, EventAddDBAuditFilter).SetAPIPubKey("blabla").Submit()
			convey.So(err, convey.ShouldEqual, errIPAddrNotFound)
		})

		convey.Convey("operator ip not found", func() {
			err := NewEvent(ctx, EventAddDBAuditFilter).SetUserToken("blabla").Submit()
			convey.So(err, convey.ShouldEqual, errIPAddrNotFound)
		})

		convey.Convey("access token set", func() {
			err := NewEvent(ctx, EventAddDBAuditFilter).SetAccessToken("blabla").Submit()
			convey.So(err, convey.ShouldEqual, errIPAddrNotFound)
		})

		convey.Convey("result not set", func() {
			err := NewEvent(ctx, EventChangePassword).SetUserToken("blabla").SetOperatorIP("ip addr").Submit()
			convey.So(err, convey.ShouldEqual, errResultNotSet)
		})

		convey.Convey("details not set", func() {
			err := NewEvent(ctx, EventAddPaymentCard).SetUserToken("token").SetOperatorIP("ip").Succeed().Submit()
			convey.So(err, convey.ShouldEqual, errDetailsNotSet)
		})
	})
}

func TestSubmitWithoutInitialization(t *testing.T) {
	originalEventbus := eventbus
	eventbus = nil
	t.Cleanup(func() {
		eventbus = originalEventbus
	})

	err := NewEvent(context.Background(), EventLoginOrg).
		SetOperatorID(1).
		SetOperatorIP("127.0.0.1").
		SetDetails(Details{KeyUserEmail: "local@example.com"}.Build()).
		Succeed().
		Submit()
	if err != errEventbusNotInitialized {
		t.Fatalf("Submit() error = %v, want %v", err, errEventbusNotInitialized)
	}
}
