package jobqueue

import (
	"context"
	"errors"
	"testing"
)

// MockSuccessfulRunnable gibt immer ResultStatusSuccess zurück
type MockSuccessfulRunnable struct{}

func (m MockSuccessfulRunnable) Run(ctx context.Context) (RunResult[string], error) {
	return RunResult[string]{Status: ResultStatusSuccess, Data: "Success"}, nil
}

// MockFailedRunnable gibt immer ResultStatusFailed zurück
type MockFailedRunnable struct{}

func (m MockFailedRunnable) Run(ctx context.Context) (RunResult[string], error) {
	return RunResult[string]{Status: ResultStatusFailed, Data: "Failed"}, nil
}

// MockErrorRunnable gibt immer einen Fehler zurück
type MockErrorRunnable struct{}

func (m MockErrorRunnable) Run(ctx context.Context) (RunResult[string], error) {
	return RunResult[string]{}, errors.New("RunError")
}

func (m MockErrorRunnable) GetType() string {
	return "mock-error"
}

func (m MockFailedRunnable) GetType() string {
	return "mock-failed"
}

func (m MockSuccessfulRunnable) GetType() string {
	return "mock-success"
}

func (m MockErrorRunnable) GetPersistence() RunnableImport {
	return RunnableImport{}
}

func (m MockFailedRunnable) GetPersistence() RunnableImport {
	return RunnableImport{}
}
func (m MockSuccessfulRunnable) GetPersistence() RunnableImport {
	return RunnableImport{}
}

func TestRunnable(t *testing.T) {
	var run Runnable[string]

	ctx := context.Background()

	// Test für erfolgreiche Ausführung
	run = MockSuccessfulRunnable{}
	result, err := run.Run(ctx)
	if result.Status != ResultStatusSuccess || err != nil {
		t.Errorf("Expected success, got %v, %v", result.Status, err)
	}

	// Test für fehlgeschlagene Ausführung
	run = MockFailedRunnable{}
	result, err = run.Run(ctx)
	if result.Status != ResultStatusFailed || err != nil {
		t.Errorf("Expected failure, got %v, %v", result.Status, err)
	}

	// Test für Ausführungsfehler
	run = MockErrorRunnable{}
	result, err = run.Run(ctx)
	if err == nil {
		t.Errorf("Expected error, got nil")
	}
}