package keeper_test

import (
	"time"

	"cosmossdk.io/math"

	"git.cw.tr/mukan-network/mukan-sdk/x/protocolpool/types"
)

func (suite *KeeperTestSuite) TestInitExportGenesis() {
	suite.bankKeeper.EXPECT().BlockedAddr(recipientAddr).Return(false).Times(1)

	gs := types.NewGenesisState(
		[]types.ContinuousFund{
			{
				Recipient:  recipientAddr.String(),
				Percentage: math.LegacyMustNewDecFromStr("0.1"),
				Expiry:     nil,
			},
		},
	)

	err := suite.poolKeeper.InitGenesis(suite.ctx, gs)
	suite.Require().NoError(err)

	// Export
	exportedGenState, err := suite.poolKeeper.ExportGenesis(suite.ctx)
	suite.Require().NoError(err)
	suite.Require().Equal(gs.ContinuousFunds, exportedGenState.ContinuousFunds)
}

func (suite *KeeperTestSuite) TestInitExportGenesis_BlockedAddress() {
	suite.bankKeeper.EXPECT().BlockedAddr(recipientAddr).Return(true).Times(1)

	gs := types.NewGenesisState(
		[]types.ContinuousFund{
			{
				Recipient:  recipientAddr.String(),
				Percentage: math.LegacyMustNewDecFromStr("0.1"),
				Expiry:     nil,
			},
		},
	)

	err := suite.poolKeeper.InitGenesis(suite.ctx, gs)
	suite.Require().Error(err)
}

func (suite *KeeperTestSuite) TestInitGenesis_InvalidRecipient() {
	gs := types.NewGenesisState([]types.ContinuousFund{
		{
			Recipient:  "invalid_address", // This should fail the address decoding.
			Percentage: math.LegacyMustNewDecFromStr("0.1"),
			Expiry:     nil,
		},
	})

	err := suite.poolKeeper.InitGenesis(suite.ctx, gs)
	suite.Require().Error(err)
}

func (suite *KeeperTestSuite) TestInitGenesis_SkipsExpiredFunds() {
	suite.bankKeeper.EXPECT().BlockedAddr(recipientAddr).Return(false).Times(1)
	suite.bankKeeper.EXPECT().BlockedAddr(recipientAddr2).Return(false).Times(1)

	// Set up block time for the test
	currentTime := suite.ctx.BlockTime()
	expiredTime := currentTime.Add(-time.Hour)
	futureTime := currentTime.Add(time.Hour)

	gs := types.NewGenesisState([]types.ContinuousFund{
		{
			Recipient:  recipientAddr.String(),
			Percentage: math.LegacyMustNewDecFromStr("0.1"),
			Expiry:     &expiredTime, // This fund should be ignored.
		},
		{
			Recipient:  recipientAddr2.String(),
			Percentage: math.LegacyMustNewDecFromStr("0.2"),
			Expiry:     &futureTime, // This fund should be accepted.
		},
	})

	err := suite.poolKeeper.InitGenesis(suite.ctx, gs)
	suite.Require().NoError(err)

	// Export and verify only the valid continuous fund is present.
	exportedGenState, err := suite.poolKeeper.ExportGenesis(suite.ctx)
	suite.Require().NoError(err)
	suite.Require().Len(exportedGenState.ContinuousFunds, 1)
	suite.Require().Equal(recipientAddr2.String(), exportedGenState.ContinuousFunds[0].Recipient)
}
