package skip

import (
	"fmt"
	"testing"

	"github.com/goreleaser/goreleaser/v2/pkg/context"
	"github.com/stretchr/testify/require"
)

func TestSkip(t *testing.T) {
	fakeErr := fmt.Errorf("fake error")
	action := func(_ *context.Context) error {
		return fakeErr
	}

	t.Run("not a skipper", func(t *testing.T) {
		require.EqualError(t, Maybe(action, action)(nil), fakeErr.Error())
	})

	t.Run("skip", func(t *testing.T) {
		require.NoError(t, Maybe(skipper{true}, action)(nil))
	})

	t.Run("do not skip", func(t *testing.T) {
		require.EqualError(t, Maybe(skipper{false}, action)(nil), fakeErr.Error())
	})
}

func TestSkipErr(t *testing.T) {
	fakeErr := fmt.Errorf("fake error")
	action := func(_ *context.Context) error {
		return fakeErr
	}

	t.Run("no err", func(t *testing.T) {
		require.NoError(t, Maybe(errSkipper{true, nil}, action)(nil))
	})

	t.Run("with err", func(t *testing.T) {
		require.EqualError(t, Maybe(
			errSkipper{false, fmt.Errorf("skip err")},
			action,
		)(nil), "skip: skip err")
	})
}

var (
	_ Skipper    = skipper{}
	_ ErrSkipper = errSkipper{}
)

type skipper struct {
	skip bool
}

func (s skipper) String() string { return "blah" }

func (s skipper) Skip(_ *context.Context) bool {
	return s.skip
}

type errSkipper struct {
	skip bool
	err  error
}

func (s errSkipper) String() string { return "blah" }

func (s errSkipper) Skip(_ *context.Context) (bool, error) {
	return s.skip, s.err
}
