package nextgentasks

import (
	"sync"

	"go.uber.org/zap"
)

// DeltaLakeLock provides a mutex to ensure that only one task can access Delta Lake at a time
type DeltaLakeLock struct {
	mutex sync.Mutex
	log   *zap.Logger
}

// NewDeltaLakeLock creates a new Delta Lake lock
func NewDeltaLakeLock(log *zap.Logger) *DeltaLakeLock {
	return &DeltaLakeLock{
		log: log,
	}
}

// Lock acquires the Delta Lake lock
func (d *DeltaLakeLock) Lock(taskName string) {
	d.log.Debug("attempting to acquire Delta Lake lock", zap.String("task", taskName))
	d.mutex.Lock()
	d.log.Debug("Delta Lake lock acquired", zap.String("task", taskName))
}

// Unlock releases the Delta Lake lock
func (d *DeltaLakeLock) Unlock(taskName string) {
	d.log.Debug("releasing Delta Lake lock", zap.String("task", taskName))
	d.mutex.Unlock()
	d.log.Debug("Delta Lake lock released", zap.String("task", taskName))
}

// Global Delta Lake lock instance
var globalDeltaLakeLock *DeltaLakeLock

// InitGlobalDeltaLakeLock initializes the global Delta Lake lock
func InitGlobalDeltaLakeLock(log *zap.Logger) {
	if globalDeltaLakeLock != nil {
		log.Error("global Delta Lake lock already initialized")
		return
	}
	globalDeltaLakeLock = NewDeltaLakeLock(log)
}

// GetGlobalDeltaLakeLock returns the global Delta Lake lock
func GetGlobalDeltaLakeLock() *DeltaLakeLock {
	if globalDeltaLakeLock == nil {
		panic("global Delta Lake lock not initialized")
	}
	return globalDeltaLakeLock
}
