package database

import (
	"fmt"
	"io"
	"os"
	"path/filepath"

	kv "git.sr.ht/~ashkeel/kilovolt/v12"
	"github.com/urfave/cli/v2"
)

// Driver is a driver wrapping a supported database
type Driver interface {
	Hub() *kv.Hub
	Close() error
	Import(map[string]string) error
	Export(io.Writer) error
	Restore(io.Reader) error
	Backup(io.Writer) error
}

type BackupOptions struct {
	BackupDir      string
	BackupInterval int
	MaxBackups     int
}

const databaseDefaultDriver = "pebble"

func getDatabaseDriverName(ctx *cli.Context) string {
	driver := ctx.String("driver")
	if driver != "auto" {
		return driver
	}

	dbDirectory := ctx.String("database-dir")
	file, err := os.ReadFile(filepath.Join(dbDirectory, "stul-driver"))
	if err != nil {
		// No driver file found (or file corrupted), use default driver
		return databaseDefaultDriver
	}
	return string(file)
}

func GetDatabaseDriver(ctx *cli.Context) (Driver, error) {
	name := getDatabaseDriverName(ctx)
	dbDirectory := ctx.String("database-dir")

	switch name {
	case "badger":
		return nil, cli.Exit("Badger is not supported anymore as a database driver", 64)
	case "pebble":
		db, err := NewPebble(dbDirectory)
		if err != nil {
			return nil, cli.Exit(err.Error(), 64)
		}
		return db, nil
	default:
		return nil, cli.Exit(fmt.Sprintf("Unknown database driver: %s", name), 64)
	}
}
