package scheduler

import (
	"context"
	"fmt"
	"testing"
	"time"

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

func Test_CanStartAndTerminate(t *testing.T) {
	s := NewScheduler(context.Background())
	s.StartJobEvery(1*time.Minute, func() { fmt.Println("boop") })

	err := s.Shutdown()
	assert.NoError(t, err, "Shutdown should return no errors")
	assert.Empty(t, s.crontab.Entries(), "all jobs should have been removed")
}

func Test_CanTerminateByCancellingContext(t *testing.T) {
	ctx, cancel := context.WithCancel(context.Background())
	s := NewScheduler(ctx)
	s.StartJobEvery(1*time.Minute, func() { fmt.Println("boop") })

	cancel()

	for i := 0; i < 100; i++ {
		if len(s.crontab.Entries()) == 0 {
			return
		}
		time.Sleep(10 * time.Millisecond)
	}
	t.Fatal("all jobs are expected to be cleaned by now; it might be a timing issue, otherwise implementation defect")
}

func Test_StartAndStopJob(t *testing.T) {
	s := NewScheduler(context.Background())
	defer s.Shutdown()

	ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)

	var jobOne string
	var workDone bool
	jobOne = s.StartJobEvery(time.Second, func() {
		assert.Equal(t, 1, len(s.crontab.Entries()), "scheduler should have one active job")
		workDone = true

		s.StopJob(jobOne)
		cancel()
	})

	<-ctx.Done()
	assert.True(t, workDone, "value should been set in the job")
	assert.Equal(t, 0, len(s.crontab.Entries()), "scheduler should have no active jobs")

}