package utils

import (
	"context"

	"git.defalsify.org/vise.git/db"
	fsdb "git.defalsify.org/vise.git/db/fs"
	"git.defalsify.org/vise.git/logging"
)

var (
	logg = logging.NewVanilla().WithDomain("adminstore")
)

type AdminStore struct {
	ctx     context.Context
	FsStore db.Db
}

func NewAdminStore(ctx context.Context, fileName string) (*AdminStore, error) {
	fsStore, err := getFsStore(ctx, fileName)
	if err != nil {
		return nil, err
	}
	return &AdminStore{ctx: ctx, FsStore: fsStore}, nil
}

func getFsStore(ctx context.Context, connectStr string) (db.Db, error) {
	fsStore := fsdb.NewFsDb()
	err := fsStore.Connect(ctx, connectStr)
	fsStore.SetPrefix(db.DATATYPE_USERDATA)
	if err != nil {
		return nil, err
	}
	return fsStore, nil
}

// Checks if the given sessionId is listed as an admin.
func (as *AdminStore) IsAdmin(sessionId string) (bool, error) {
	_, err := as.FsStore.Get(as.ctx, []byte(sessionId))
	if err != nil {
		if db.IsNotFound(err) {
			logg.Printf(logging.LVL_INFO, "Returning false because session id was not found")
			return false, nil
		} else {
			return false, err
		}
	}

	return true, nil
}