// Copyright 2025 The Forgejo Authors. All rights reserved.
// SPDX-License-Identifier: GPL-3.0-or-later

package actions

import (
	"testing"

	"forgejo.org/modules/translation"

	"github.com/stretchr/testify/assert"
)

func TestTranslatePreExecutionError(t *testing.T) {
	translation.InitLocales(t.Context())
	lang := translation.NewLocale("en-US")

	tests := []struct {
		name     string
		run      *ActionRun
		expected string
	}{
		{
			name:     "legacy",
			run:      &ActionRun{PreExecutionError: "legacy message"},
			expected: "legacy message",
		},
		{
			name:     "no error",
			run:      &ActionRun{},
			expected: "",
		},
		{
			name: "ErrorCodeEventDetectionError",
			run: &ActionRun{
				PreExecutionErrorCode:    ErrorCodeEventDetectionError,
				PreExecutionErrorDetails: []any{"inner error message"},
			},
			expected: "Unable to parse supported events in workflow: inner error message",
		},
		{
			name: "ErrorCodeJobParsingError",
			run: &ActionRun{
				PreExecutionErrorCode:    ErrorCodeJobParsingError,
				PreExecutionErrorDetails: []any{"inner error message"},
			},
			expected: "Unable to parse jobs in workflow: inner error message",
		},
		{
			name: "ErrorCodePersistentIncompleteMatrix",
			run: &ActionRun{
				PreExecutionErrorCode:    ErrorCodePersistentIncompleteMatrix,
				PreExecutionErrorDetails: []any{"blocked_job", "needs-1, needs-2"},
			},
			expected: "Unable to evaluate `strategy.matrix` of job blocked_job due to a `needs` expression that was invalid. It may reference a job that is not in it's 'needs' list (needs-1, needs-2), or an output that doesn't exist on one of those jobs.",
		},
		{
			name: "ErrorCodeIncompleteMatrixMissingOutput",
			run: &ActionRun{
				PreExecutionErrorCode:    ErrorCodeIncompleteMatrixMissingOutput,
				PreExecutionErrorDetails: []any{"blocked_job", "other_job", "some_output"},
			},
			expected: "Unable to evaluate `strategy.matrix` of job blocked_job: job other_job does not have an output some_output.",
		},
		{
			name: "ErrorCodeIncompleteMatrixMissingJob",
			run: &ActionRun{
				PreExecutionErrorCode:    ErrorCodeIncompleteMatrixMissingJob,
				PreExecutionErrorDetails: []any{"blocked_job", "other_job", "needs-1, needs-2"},
			},
			expected: "Unable to evaluate `strategy.matrix` of job blocked_job: job other_job is not in the `needs` list of job blocked_job (needs-1, needs-2).",
		},
		{
			name: "ErrorCodeIncompleteMatrixUnknownCause",
			run: &ActionRun{
				PreExecutionErrorCode:    ErrorCodeIncompleteMatrixUnknownCause,
				PreExecutionErrorDetails: []any{"blocked_job"},
			},
			expected: "Unable to evaluate `strategy.matrix` of job blocked_job: unknown error.",
		},
		{
			name: "ErrorCodeIncompleteRunsOnMissingOutput",
			run: &ActionRun{
				PreExecutionErrorCode:    ErrorCodeIncompleteRunsOnMissingOutput,
				PreExecutionErrorDetails: []any{"blocked_job", "other_job", "some_output"},
			},
			expected: "Unable to evaluate `runs-on` of job blocked_job: job other_job does not have an output some_output.",
		},
		{
			name: "ErrorCodeIncompleteRunsOnMissingJob",
			run: &ActionRun{
				PreExecutionErrorCode:    ErrorCodeIncompleteRunsOnMissingJob,
				PreExecutionErrorDetails: []any{"blocked_job", "other_job", "needs-1, needs-2"},
			},
			expected: "Unable to evaluate `runs-on` of job blocked_job: job other_job is not in the `needs` list of job blocked_job (needs-1, needs-2).",
		},
		{
			name: "ErrorCodeIncompleteRunsOnMissingMatrixDimension",
			run: &ActionRun{
				PreExecutionErrorCode:    ErrorCodeIncompleteRunsOnMissingMatrixDimension,
				PreExecutionErrorDetails: []any{"blocked_job", "platfurm"},
			},
			expected: "Unable to evaluate `runs-on` of job blocked_job: matrix dimension platfurm does not exist.",
		},
		{
			name: "ErrorCodeIncompleteRunsOnUnknownCause",
			run: &ActionRun{
				PreExecutionErrorCode:    ErrorCodeIncompleteRunsOnUnknownCause,
				PreExecutionErrorDetails: []any{"blocked_job"},
			},
			expected: "Unable to evaluate `runs-on` of job blocked_job: unknown error.",
		},
	}
	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			err := TranslatePreExecutionError(lang, tt.run)
			assert.Equal(t, tt.expected, err)
		})
	}
}
