package keeper

import (
	"github.com/cosmos/cosmos-sdk/codec"
	storetypes "github.com/cosmos/cosmos-sdk/store/types"
	"github.com/kava-labs/kava/x/earn/types"

	paramtypes "github.com/cosmos/cosmos-sdk/x/params/types"
)

// Keeper keeper for the earn module
type Keeper struct {
	key           storetypes.StoreKey
	cdc           codec.Codec
	paramSubspace paramtypes.Subspace
	hooks         types.EarnHooks
	accountKeeper types.AccountKeeper
	bankKeeper    types.BankKeeper
	liquidKeeper  types.LiquidKeeper

	// Keepers used for strategies
	hardKeeper    types.HardKeeper
	savingsKeeper types.SavingsKeeper

	// Keeper for community pool transfers
	distKeeper types.DistributionKeeper
}

// NewKeeper creates a new keeper
func NewKeeper(
	cdc codec.Codec,
	key storetypes.StoreKey,
	paramstore paramtypes.Subspace,
	accountKeeper types.AccountKeeper,
	bankKeeper types.BankKeeper,
	liquidKeeper types.LiquidKeeper,
	hardKeeper types.HardKeeper,
	savingsKeeper types.SavingsKeeper,
	distKeeper types.DistributionKeeper,
) Keeper {
	if !paramstore.HasKeyTable() {
		paramstore = paramstore.WithKeyTable(types.ParamKeyTable())
	}

	return Keeper{
		key:           key,
		cdc:           cdc,
		paramSubspace: paramstore,
		accountKeeper: accountKeeper,
		bankKeeper:    bankKeeper,
		liquidKeeper:  liquidKeeper,
		hardKeeper:    hardKeeper,
		savingsKeeper: savingsKeeper,
		distKeeper:    distKeeper,
	}
}

// SetHooks adds hooks to the keeper.
func (k *Keeper) SetHooks(sh types.EarnHooks) *Keeper {
	if k.hooks != nil {
		panic("cannot set earn hooks twice")
	}
	k.hooks = sh
	return k
}

// ClearHooks clears the hooks on the keeper
func (k *Keeper) ClearHooks() {
	k.hooks = nil
}