//go:build !runOnTask

// Copyright 2023 schukai GmbH
// SPDX-License-Identifier: AGPL-3.0
package jobqueue

import (
	"fmt"
	"github.com/stretchr/testify/assert"
	"gorm.io/driver/sqlite"
	"gorm.io/gorm"
	"testing"
	"time"
)

func TestWriteToDB6(t *testing.T) {

	// it is necessary to have a running mysql server
	// docker rm -f mysql-test && \
	// docker run --name mysql-test -e MYSQL_ROOT_PASSWORD=my-secret-pw -e MYSQL_DATABASE=testdb -p 3306:3306 -d mysql:latest && \
	// docker logs -f mysql-test

	//dsn := "root:my-secret-pw@tcp(localhost:3306)/testdb?charset=utf8mb4&parseTime=True&loc=Local"
	//db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})

	gormDB, err := gorm.Open(sqlite.Open("file:unique_id?mode=memory&cache=shared"), &gorm.Config{})
	if err != nil {
		t.Fatalf("a error occurred while opening the database: %v", err)
	}
	t.Cleanup(func() {
		sqlDB, err := gormDB.DB()
		if err != nil {
			t.Fatalf("failed to get generic database object from GORM DB: %v", err)
		}
		_ = sqlDB.Close()
	})

	db := gormDB

	manager := NewManager()
	manager.SetDB(db)
	err = manager.AddWorker(NewLocalWorker(1))
	assert.Nil(t, err)

	err = manager.Start()
	assert.Nil(t, err)

	mgr := manager

	numJobs := 1000
	jobIDs := make([]JobID, numJobs)

	for i := 0; i < numJobs; i++ {
		jobID := JobID(fmt.Sprintf("burstJobA%d", i))
		jobIDs[i] = jobID

		runner := &CounterRunnable{}
		job := NewJob[CounterResult](jobID, runner)

		scheduler := &InstantScheduler{}
		err = mgr.ScheduleJob(job, scheduler)
		assert.Nil(t, err)

		mgr.mu.Lock()
		mgr.jobSyncer.Sync(job)
		mgr.mu.Unlock()
		time.Sleep(10 * time.Millisecond)

	}

	manager.WaitSync()

	time.Sleep(2 * time.Second)

	for _, jobID := range jobIDs {
		var tmpJob JobPersistence
		err = db.First(&tmpJob, "id = ?", jobID).Error
		if err != nil {
			t.Errorf("Job id %s not found in database: %v", jobID, err)
		}
	}

	// check if all jobs are in the database
	var jobCount int64
	err = db.Model(&JobPersistence{}).Count(&jobCount).Error
	assert.Nil(t, err)
	assert.Equal(t, int64(numJobs), jobCount)

}