package alert

import (
	"testing"
)

func TestAlert_ValidateAndSetDefaults(t *testing.T) {
	invalidDescription := "\""
	scenarios := []struct {
		name                     string
		alert                    Alert
		expectedError            error
		expectedSuccessThreshold int
		expectedFailureThreshold int
	}{
		{
			name: "valid-empty",
			alert: Alert{
				Description:      nil,
				FailureThreshold: 0,
				SuccessThreshold: 0,
			},
			expectedError:            nil,
			expectedFailureThreshold: 3,
			expectedSuccessThreshold: 2,
		},
		{
			name: "invalid-description",
			alert: Alert{
				Description:      &invalidDescription,
				FailureThreshold: 10,
				SuccessThreshold: 5,
			},
			expectedError:            ErrAlertWithInvalidDescription,
			expectedFailureThreshold: 10,
			expectedSuccessThreshold: 5,
		},
	}
	for _, scenario := range scenarios {
		t.Run(scenario.name, func(t *testing.T) {
			if err := scenario.alert.ValidateAndSetDefaults(); err != scenario.expectedError {
				t.Errorf("expected error %v, got %v", scenario.expectedError, err)
			}
			if scenario.alert.SuccessThreshold != scenario.expectedSuccessThreshold {
				t.Errorf("expected success threshold %v, got %v", scenario.expectedSuccessThreshold, scenario.alert.SuccessThreshold)
			}
			if scenario.alert.FailureThreshold != scenario.expectedFailureThreshold {
				t.Errorf("expected failure threshold %v, got %v", scenario.expectedFailureThreshold, scenario.alert.FailureThreshold)
			}
		})
	}
}

func TestAlert_IsEnabled(t *testing.T) {
	if (Alert{Enabled: nil}).IsEnabled() {
		t.Error("alert.IsEnabled() should've returned false, because Enabled was set to nil")
	}
	if value := false; (Alert{Enabled: &value}).IsEnabled() {
		t.Error("alert.IsEnabled() should've returned false, because Enabled was set to false")
	}
	if value := true; !(Alert{Enabled: &value}).IsEnabled() {
		t.Error("alert.IsEnabled() should've returned true, because Enabled was set to true")
	}
}

func TestAlert_GetDescription(t *testing.T) {
	if (Alert{Description: nil}).GetDescription() != "" {
		t.Error("alert.GetDescription() should've returned an empty string, because Description was set to nil")
	}
	if value := "description"; (Alert{Description: &value}).GetDescription() != value {
		t.Error("alert.GetDescription() should've returned false, because Description was set to 'description'")
	}
}

func TestAlert_IsSendingOnResolved(t *testing.T) {
	if (Alert{SendOnResolved: nil}).IsSendingOnResolved() {
		t.Error("alert.IsSendingOnResolved() should've returned false, because SendOnResolved was set to nil")
	}
	if value := false; (Alert{SendOnResolved: &value}).IsSendingOnResolved() {
		t.Error("alert.IsSendingOnResolved() should've returned false, because SendOnResolved was set to false")
	}
	if value := true; !(Alert{SendOnResolved: &value}).IsSendingOnResolved() {
		t.Error("alert.IsSendingOnResolved() should've returned true, because SendOnResolved was set to true")
	}
}
