package actions_test

import (
	"testing"

	"github.com/nexuscrm/tests/contract/ui_api/internal/asserts"
	"github.com/stretchr/testify/require"
)

func assertActionsPayload(t testing.TB, body map[string]any) {
	t.Helper()

	_, value := asserts.RequireAnyField(t, body, "actions", "actionList")

	var actions []any
	switch typed := value.(type) {
	case []any:
		actions = typed
	case map[string]any:
		for key, entry := range typed {
			require.NotEmpty(t, key, "action category key should not be empty")
			if list, ok := entry.([]any); ok && len(list) > 0 {
				actions = list
				break
			}
		}
	default:
		require.Fail(t, "unexpected actions payload", "type=%T", value)
	}

	asserts.RequireNonEmptySlice(t, actions, "actions")
	for i, entry := range actions {
		if i >= 5 {
			break
		}
		action := asserts.RequireMap(t, entry)
		assertActionItem(t, action)
	}
}

func assertActionItem(t testing.TB, action map[string]any) {
	t.Helper()

	_ = asserts.RequireStringFieldAny(t, action, "apiName", "name")
	_ = asserts.RequireStringFieldAny(t, action, "label", "title")
	_ = asserts.RequireStringFieldAny(t, action, "type", "actionType", "subtype")

	asserts.RequireStringIfPresent(t, action, "actionTarget")
	asserts.RequireStringIfPresent(t, action, "target")
	asserts.RequireStringIfPresent(t, action, "iconUrl")
	asserts.RequireStringIfPresent(t, action, "iconName")
	asserts.RequireStringIfPresent(t, action, "sectionName")
	asserts.RequireStringIfPresent(t, action, "recordId")
	asserts.RequireStringIfPresent(t, action, "recordTypeId")
	asserts.RequireBoolIfPresent(t, action, "isCreateable")
	asserts.RequireBoolIfPresent(t, action, "isAvailable")

	if idRaw, ok := action["id"].(string); ok && idRaw != "" {
		if len(idRaw) == 15 || len(idRaw) == 18 {
			asserts.RequireSalesforceID(t, idRaw)
		}
	}
}
