package bolt

import (
	"strconv"

	"github.com/portainer/portainer"

	"github.com/boltdb/bolt"
)

// VersionService represents a service to manage stored versions.
type VersionService struct {
	store *Store
}

const (
	dBVersionKey = "DB_VERSION"
)

// DBVersion retrieves the stored database version.
func (service *VersionService) DBVersion() (int, error) {
	var data []byte
	err := service.store.db.View(func(tx *bolt.Tx) error {
		bucket := tx.Bucket([]byte(versionBucketName))
		value := bucket.Get([]byte(dBVersionKey))
		if value == nil {
			return portainer.ErrDBVersionNotFound
		}

		data = make([]byte, len(value))
		copy(data, value)
		return nil
	})
	if err != nil {
		return 0, err
	}

	dbVersion, err := strconv.Atoi(string(data))
	if err != nil {
		return 0, err
	}

	return dbVersion, nil
}

// StoreDBVersion store the database version.
func (service *VersionService) StoreDBVersion(version int) error {
	return service.store.db.Update(func(tx *bolt.Tx) error {
		bucket := tx.Bucket([]byte(versionBucketName))

		data := []byte(strconv.Itoa(version))
		err := bucket.Put([]byte(dBVersionKey), data)
		if err != nil {
			return err
		}
		return nil
	})
}