package keeper

import (
	"fmt"

	sdk "github.com/cosmos/cosmos-sdk/types"
	"github.com/kava-labs/kava/x/earn/types"
)

// Strategy is the interface that must be implemented by a strategy.
type Strategy interface {
	// GetStrategyType returns the strategy type
	GetStrategyType() types.StrategyType

	// GetEstimatedTotalAssets returns the estimated total assets of the
	// strategy with the specified denom. This is the value if the strategy were
	// to liquidate all assets.
	//
	// **Note:** This may not reflect the true value as it may become outdated
	// from market changes.
	GetEstimatedTotalAssets(ctx sdk.Context, denom string) (sdk.Coin, error)

	// Deposit the specified amount of coins into this strategy.
	Deposit(ctx sdk.Context, amount sdk.Coin) error

	// Withdraw the specified amount of coins from this strategy.
	Withdraw(ctx sdk.Context, amount sdk.Coin) error
}

// GetStrategy returns the strategy for the given strategy type.
func (k *Keeper) GetStrategy(strategyType types.StrategyType) (Strategy, error) {
	switch strategyType {
	case types.STRATEGY_TYPE_HARD:
		return (*HardStrategy)(k), nil
	case types.STRATEGY_TYPE_SAVINGS:
		return (*SavingsStrategy)(k), nil
	default:
		return nil, fmt.Errorf("unknown strategy type: %s", strategyType)
	}
}