package oidc

import (
	"io"
	"net/http"
	"testing"

	"github.com/stretchr/testify/require"
	"github.com/zitadel/oidc/v3/pkg/oidc"
	"github.com/zitadel/oidc/v3/pkg/op"

	"github.com/zitadel/zitadel/internal/zerrors"
)

func Test_oidcError(t *testing.T) {
	tests := []struct {
		name    string
		err     error
		wantErr error
	}{
		{
			name:    "nil",
			err:     nil,
			wantErr: nil,
		},
		{
			name:    "status err",
			err:     op.NewStatusError(io.ErrClosedPipe, http.StatusTeapot),
			wantErr: op.NewStatusError(io.ErrClosedPipe, http.StatusTeapot),
		},
		{
			name:    "oidc err",
			err:     oidc.ErrInvalidClient().WithParent(io.ErrClosedPipe),
			wantErr: oidc.ErrInvalidClient().WithParent(io.ErrClosedPipe),
		},
		{
			name: "unknown err",
			err:  io.ErrClosedPipe,
			wantErr: op.NewStatusError(
				oidc.ErrServerError().
					WithParent(io.ErrClosedPipe).
					WithDescription("Errors.Internal"),
				http.StatusInternalServerError,
			),
		},
		{
			name: "zitadel error, invalid request",
			err:  zerrors.ThrowPreconditionFailed(io.ErrClosedPipe, "TEST-123", "oopsie"),
			wantErr: op.NewStatusError(
				oidc.ErrInvalidRequest().
					WithParent(io.ErrClosedPipe).
					WithDescription("oopsie"),
				http.StatusBadRequest,
			),
		},
	}
	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			err := oidcError(tt.err)
			require.ErrorIs(t, err, tt.wantErr)
		})
	}
}