package linedb

import (
	"sync"
)

// LastIDManager управляет последними ID для коллекций.
// Ключ — полное имя коллекции (как в NextID/Insert), без обрезки по «_»:
// иначе user_data и events_A ломались бы на первый сегмент.
type LastIDManager struct {
	lastIDs map[string]int
	mutex   sync.RWMutex
}

var lastIDManagerInstance *LastIDManager
var lastIDManagerOnce sync.Once

// GetInstance возвращает единственный экземпляр LastIDManager
func GetLastIDManagerInstance() *LastIDManager {
	lastIDManagerOnce.Do(func() {
		lastIDManagerInstance = &LastIDManager{
			lastIDs: make(map[string]int),
		}
	})
	return lastIDManagerInstance
}

// GetLastID получает последний ID для коллекции (ключ — полное имя коллекции).
func (l *LastIDManager) GetLastID(collectionKey string) int {
	l.mutex.RLock()
	defer l.mutex.RUnlock()

	return l.lastIDs[collectionKey]
}

// SetLastID устанавливает последний ID для коллекции, если id больше текущего.
func (l *LastIDManager) SetLastID(collectionKey string, id int) {
	l.mutex.Lock()
	defer l.mutex.Unlock()

	currentID := l.lastIDs[collectionKey]
	if currentID < id {
		l.lastIDs[collectionKey] = id
	}
}

// IncrementLastID увеличивает последний ID для коллекции
func (l *LastIDManager) IncrementLastID(collectionKey string) int {
	l.mutex.Lock()
	defer l.mutex.Unlock()

	currentID := l.lastIDs[collectionKey]
	newID := currentID + 1
	l.lastIDs[collectionKey] = newID
	return newID
}
