package database

import (
	"fmt"
	"time"

	"github.com/OrlovEvgeny/go-mcache"
	"github.com/akrylysov/pogreb"
	"github.com/go-acme/lego/v4/certificate"
)

var _ CertDB = tmpDB{}

type tmpDB struct {
	intern *mcache.CacheDriver
	ttl    time.Duration
}

func (p tmpDB) Close() error {
	_ = p.intern.Close()
	return nil
}

func (p tmpDB) Put(name string, cert *certificate.Resource) error {
	return p.intern.Set(name, cert, p.ttl)
}

func (p tmpDB) Get(name string) (*certificate.Resource, error) {
	cert, has := p.intern.Get(name)
	if !has {
		return nil, fmt.Errorf("cert for '%s' not found", name)
	}
	return cert.(*certificate.Resource), nil
}

func (p tmpDB) Delete(key string) error {
	p.intern.Remove(key)
	return nil
}

func (p tmpDB) Compact() (string, error) {
	p.intern.Truncate()
	return "Truncate done", nil
}

func (p tmpDB) Items() *pogreb.ItemIterator {
	panic("ItemIterator not implemented for tmpDB")
}

func NewTmpDB() (CertDB, error) {
	return &tmpDB{
		intern: mcache.New(),
		ttl:    time.Minute,
	}, nil
}