package keeper

import (
	"fmt"

	sdk "github.com/cosmos/cosmos-sdk/types"

	"github.com/kava-labs/kava/x/liquid/types"
)

func (k Keeper) CollectStakingRewards(
	ctx sdk.Context,
	validator sdk.ValAddress,
	destinationModAccount string,
) (sdk.Coins, error) {
	macc := k.accountKeeper.GetModuleAccount(ctx, types.ModuleAccountName)

	// Ensure withdraw address is as expected
	withdrawAddr := k.distributionKeeper.GetDelegatorWithdrawAddr(ctx, macc.GetAddress())
	if !withdrawAddr.Equals(macc.GetAddress()) {
		panic(fmt.Sprintf(
			"unexpected withdraw address for liquid staking module account, expected %s, got %s",
			macc.GetAddress(), withdrawAddr,
		))
	}

	rewards, err := k.distributionKeeper.WithdrawDelegationRewards(ctx, macc.GetAddress(), validator)
	if err != nil {
		return nil, err
	}

	if rewards.IsZero() {
		return rewards, nil
	}

	err = k.bankKeeper.SendCoinsFromModuleToModule(ctx, types.ModuleAccountName, destinationModAccount, rewards)
	if err != nil {
		return nil, err
	}

	return rewards, nil
}

func (k Keeper) CollectStakingRewardsByDenom(
	ctx sdk.Context,
	derivativeDenom string,
	destinationModAccount string,
) (sdk.Coins, error) {
	valAddr, err := types.ParseLiquidStakingTokenDenom(derivativeDenom)
	if err != nil {
		return nil, err
	}

	return k.CollectStakingRewards(ctx, valAddr, destinationModAccount)
}