package workflow

import (
	"context"
	"fmt"
	"sync"
	"testing"
	"time"
)

// testBase zaman damgaları için sabit bir başlangıç noktası.
var testBase = time.Now().UTC().Truncate(time.Millisecond)

// Bellek içi depo, Mongo ile aynı sözleşmeyi sağlamak zorundadır: tek doğrulama yolu budur.
func TestMemoryRepo_Contract(t *testing.T) {
	StoreContract(t, func() Store { return NewMemoryRepo() })
}

// Depo eşzamanlı kullanımda veri kaybetmemeli (go test -race ile koşulur).
func TestMemoryRepo_ConcurrentAccess(t *testing.T) {
	ctx := context.Background()
	r := NewMemoryRepo()

	const n = 50
	var wg sync.WaitGroup
	for i := 0; i < n; i++ {
		wg.Add(1)
		go func(i int) {
			defer wg.Done()
			w := contractWorkflow(fmt.Sprintf("wf_%d", i), "u1", "Akış", testBase)
			if err := r.Create(ctx, w); err != nil {
				t.Errorf("create: %v", err)
				return
			}
			if _, err := r.Get(ctx, "u1", w.ID); err != nil {
				t.Errorf("get: %v", err)
			}
			if _, err := r.List(ctx, "u1", ListFilter{}, 0, 0); err != nil {
				t.Errorf("list: %v", err)
			}
		}(i)
	}
	wg.Wait()

	got, err := r.List(ctx, "u1", ListFilter{}, 0, 0)
	if err != nil {
		t.Fatal(err)
	}
	if len(got) != n {
		t.Errorf("kayıt sayısı: %d (%d bekleniyordu)", len(got), n)
	}
}
