package middleware

import (
	"context"
	"reflect"
	"testing"
)

type mockIder struct {
	Identifier string
}

func (m *mockIder) ID() string { return m.Identifier }

func noError(t *testing.T, err error) {
	t.Helper()
	if err != nil {
		t.Errorf("expect no error, got %v", err)
	}
}

func mockInitializeMiddleware(id string) InitializeMiddleware {
	return InitializeMiddlewareFunc(id,
		func(
			ctx context.Context, in InitializeInput, next InitializeHandler,
		) (
			out InitializeOutput, metadata Metadata, err error,
		) {
			return next.HandleInitialize(ctx, in)
		})
}

func mockSerializeMiddleware(id string) SerializeMiddleware {
	return SerializeMiddlewareFunc(id,
		func(
			ctx context.Context, in SerializeInput, next SerializeHandler,
		) (
			out SerializeOutput, metadata Metadata, err error,
		) {
			return next.HandleSerialize(ctx, in)
		})
}

func mockBuildMiddleware(id string) BuildMiddleware {
	return BuildMiddlewareFunc(id,
		func(
			ctx context.Context, in BuildInput, next BuildHandler,
		) (
			out BuildOutput, metadata Metadata, err error,
		) {
			return next.HandleBuild(ctx, in)
		})
}

func mockFinalizeMiddleware(id string) FinalizeMiddleware {
	return FinalizeMiddlewareFunc(id,
		func(
			ctx context.Context, in FinalizeInput, next FinalizeHandler,
		) (
			out FinalizeOutput, metadata Metadata, err error,
		) {
			return next.HandleFinalize(ctx, in)
		})
}

func mockDeserializeMiddleware(id string) DeserializeMiddleware {
	return DeserializeMiddlewareFunc(id,
		func(
			ctx context.Context, in DeserializeInput, next DeserializeHandler,
		) (
			out DeserializeOutput, metadata Metadata, err error,
		) {
			return next.HandleDeserialize(ctx, in)
		})
}

func expectID(t *testing.T, m ider, expect string) {
	t.Helper()
	if m == nil {
		t.Error("expect is nil")
		return
	}
	if actual := m.ID(); expect != actual {
		t.Errorf("expect %q, got %q", expect, actual)
	}
}

func expectIDList(t *testing.T, expect, actual []string) {
	t.Helper()
	if len(expect) == 0 && len(actual) == 0 {
		return
	}
	if !reflect.DeepEqual(expect, actual) {
		t.Errorf("%v !=\n%v", expect, actual)
	}
}
