package dsl

import (
	"testing"

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

func TestHasPushTrigger(t *testing.T) {
	tests := []struct {
		name string
		on   any
		want bool
	}{
		{name: "string form", on: "push", want: true},
		{name: "list form", on: []any{"manual", "push"}, want: true},
		{name: "map form", on: map[string]any{"push": map[string]any{"branches": []any{"main"}}}, want: true},
		{name: "missing push", on: map[string]any{"manual": map[string]any{}}, want: false},
	}
	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			require.Equal(t, tt.want, HasPushTrigger(tt.on))
		})
	}
}

func TestHasScheduleTrigger(t *testing.T) {
	require.True(t, HasScheduleTrigger("schedule"))
	require.True(t, HasScheduleTrigger([]any{"manual", "schedule"}))
	require.True(t, HasScheduleTrigger(map[string]any{"schedule": []any{map[string]any{"cron": "* * * * *"}}}))
	require.False(t, HasScheduleTrigger(map[string]any{"push": map[string]any{}}))
}

func TestPushBranchMatches(t *testing.T) {
	on := map[string]any{
		"push": map[string]any{
			"branches":        []any{"main", "release"},
			"branches-ignore": []any{"release"},
		},
	}
	require.True(t, PushBranchMatches(on, "main"))
	require.True(t, PushBranchMatches(on, "refs/heads/main"))
	require.False(t, PushBranchMatches(on, "release"))
	require.False(t, PushBranchMatches(on, "dev"))
	require.False(t, PushBranchMatches(map[string]any{"manual": map[string]any{}}, "main"))
	require.True(t, PushBranchMatches(map[string]any{"push": map[string]any{}}, "main"))
}

func TestPushPathFiltersPresent(t *testing.T) {
	require.True(t, PushPathFiltersPresent(map[string]any{"push": map[string]any{"paths": []any{"cmd/**"}}}))
	require.True(t, PushPathFiltersPresent(map[string]any{"push": map[string]any{"paths-ignore": []any{"docs/**"}}}))
	require.False(t, PushPathFiltersPresent(map[string]any{"push": map[string]any{"branches": []any{"main"}}}))
	require.False(t, PushPathFiltersPresent(map[string]any{"manual": map[string]any{}}))
}
