package workers

import (
	"context"
	"image/color"
	"os"
	"path/filepath"
	"testing"

	"github.com/disintegration/imaging"
	"go.uber.org/zap"
)

func TestThumbnailJob_Execute(t *testing.T) {
	logger := zap.NewNop()
	ctx := context.Background()

	// Créer un répertoire temporaire pour les tests
	tmpDir := t.TempDir()

	// Créer une image de test simple (1x1 pixel PNG)
	testImagePath := filepath.Join(tmpDir, "test.png")
	testThumbnailPath := filepath.Join(tmpDir, "test_thumb.jpg")

	// Créer une image de test avec imaging (image rouge 100x100)
	img := imaging.New(100, 100, color.NRGBA{255, 0, 0, 255})
	if err := imaging.Save(img, testImagePath); err != nil {
		t.Fatalf("Failed to create test image: %v", err)
	}

	// Test 1: Génération de thumbnail normale
	t.Run("Generate thumbnail successfully", func(t *testing.T) {
		job := NewThumbnailJob(testImagePath, testThumbnailPath, 50, 50)

		err := job.Execute(ctx, logger)
		if err != nil {
			t.Fatalf("Expected no error, got: %v", err)
		}

		// Vérifier que le thumbnail existe
		if _, err := os.Stat(testThumbnailPath); os.IsNotExist(err) {
			t.Fatal("Thumbnail file was not created")
		}
	})

	// Test 2: Fichier source inexistant
	t.Run("Fail when input file does not exist", func(t *testing.T) {
		job := NewThumbnailJob("/nonexistent/image.png", testThumbnailPath, 50, 50)

		err := job.Execute(ctx, logger)
		if err == nil {
			t.Fatal("Expected error for nonexistent file, got nil")
		}
	})

	// Test 3: Valeurs par défaut
	t.Run("Use default dimensions when not specified", func(t *testing.T) {
		thumbPath2 := filepath.Join(tmpDir, "test_thumb2.jpg")
		job := NewThumbnailJob(testImagePath, thumbPath2, 0, 0)

		// Vérifier que les valeurs par défaut sont appliquées
		if job.Width != 300 || job.Height != 300 {
			t.Errorf("Expected default dimensions 300x300, got %dx%d", job.Width, job.Height)
		}

		err := job.Execute(ctx, logger)
		if err != nil {
			t.Fatalf("Expected no error, got: %v", err)
		}
	})
}

func TestNewThumbnailJob(t *testing.T) {
	t.Run("Create job with specified dimensions", func(t *testing.T) {
		job := NewThumbnailJob("input.jpg", "output.jpg", 200, 150)

		if job.InputPath != "input.jpg" {
			t.Errorf("Expected InputPath 'input.jpg', got '%s'", job.InputPath)
		}
		if job.OutputPath != "output.jpg" {
			t.Errorf("Expected OutputPath 'output.jpg', got '%s'", job.OutputPath)
		}
		if job.Width != 200 {
			t.Errorf("Expected Width 200, got %d", job.Width)
		}
		if job.Height != 150 {
			t.Errorf("Expected Height 150, got %d", job.Height)
		}
	})

	t.Run("Apply default dimensions when zero", func(t *testing.T) {
		job := NewThumbnailJob("input.jpg", "output.jpg", 0, 0)

		if job.Width != 300 {
			t.Errorf("Expected default Width 300, got %d", job.Width)
		}
		if job.Height != 300 {
			t.Errorf("Expected default Height 300, got %d", job.Height)
		}
	})
}
