package accountability

import (
	"sync"

	"github.com/dgraph-io/badger"
	"github.com/iotaledger/goshimmer/packages/identity"
	"github.com/iotaledger/goshimmer/packages/settings"
)

var ownId *identity.Identity

var lazyInit sync.Once

func OwnId() *identity.Identity {
	lazyInit.Do(initOwnId)

	return ownId
}

func initOwnId() {
	ownId = getIdentity()
}

func generateNewIdentity() *identity.Identity {
	newIdentity := identity.GenerateRandomIdentity()

	if err := settings.Set([]byte("ACCOUNTABILITY_PUBLIC_KEY"), newIdentity.PublicKey); err != nil {
		panic(err)
	}

	if err := settings.Set([]byte("ACCOUNTABILITY_PRIVATE_KEY"), newIdentity.PrivateKey); err != nil {
		panic(err)
	}

	return newIdentity
}

func getIdentity() *identity.Identity {
	publicKey, err := settings.Get([]byte("ACCOUNTABILITY_PUBLIC_KEY"))
	if err != nil {
		if err == badger.ErrKeyNotFound {
			return generateNewIdentity()
		} else {
			panic(err)
		}
	}

	privateKey, err := settings.Get([]byte("ACCOUNTABILITY_PRIVATE_KEY"))
	if err != nil {
		if err == badger.ErrKeyNotFound {
			return generateNewIdentity()
		} else {
			panic(err)
		}
	}

	return identity.NewIdentity(publicKey, privateKey)
}