package linedb

import (
	"sync"
)

// LastIDManager управляет последними ID для коллекций
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(filename string) int {
	l.mutex.RLock()
	defer l.mutex.RUnlock()

	baseFileName := l.getBaseFileName(filename)
	return l.lastIDs[baseFileName]
}

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

	baseFileName := l.getBaseFileName(filename)
	currentID := l.lastIDs[baseFileName]
	if currentID < id {
		l.lastIDs[baseFileName] = id
	}
}

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

	baseFileName := l.getBaseFileName(filename)
	currentID := l.lastIDs[baseFileName]
	newID := currentID + 1
	l.lastIDs[baseFileName] = newID
	return newID
}

// getBaseFileName извлекает базовое имя файла
func (l *LastIDManager) getBaseFileName(filename string) string {
	if idx := l.findPartitionSeparator(filename); idx != -1 {
		return filename[:idx]
	}
	return filename
}

// findPartitionSeparator находит разделитель партиции
func (l *LastIDManager) findPartitionSeparator(filename string) int {
	for i, char := range filename {
		if char == '_' {
			return i
		}
	}
	return -1
}
