package e2e_test

import (
	"encoding/hex"

	"github.com/cosmos/cosmos-sdk/codec"
	sdk "github.com/cosmos/cosmos-sdk/types"
	// communitytypes "github.com/0glabs/0g-chain/x/community/types"
)

// func (suite *IntegrationTestSuite) TestCommunityUpdateParams_NonAuthority() {
// 	// ARRANGE
// 	// setup 0g account
// 	funds := a0gi(1e5) // .1 A0GI
// 	zgChainAcc := suite.ZgChain.NewFundedAccount("community-non-authority", sdk.NewCoins(funds))

// 	gasLimit := int64(2e5)
// 	fee := a0gi(200)

// 	msg := communitytypes.NewMsgUpdateParams(
// 		zgChainAcc.SdkAddress,
// 		communitytypes.DefaultParams(),
// 	)

// 	// ACT
// 	req := util.ZgChainMsgRequest{
// 		Msgs:      []sdk.Msg{&msg},
// 		GasLimit:  uint64(gasLimit),
// 		FeeAmount: sdk.NewCoins(fee),
// 		Memo:      "this is a failure!",
// 	}
// 	res := zgChainAcc.SignAndBroadcastZgChainTx(req)

// 	// ASSERT
// 	_, err := util.WaitForSdkTxCommit(suite.ZgChain.Grpc.Query.Tx, res.Result.TxHash, 6*time.Second)
// 	suite.Require().Error(err)
// 	suite.Require().ErrorContains(
// 		err,
// 		govtypes.ErrInvalidSigner.Error(),
// 		"should return with authority check error",
// 	)
// }

// func (suite *IntegrationTestSuite) TestCommunityUpdateParams_Authority() {
// 	// ARRANGE
// 	govParamsRes, err := suite.ZgChain.Grpc.Query.Gov.Params(context.Background(), &govv1.QueryParamsRequest{
// 		ParamsType: govv1.ParamDeposit,
// 	})
// 	suite.NoError(err)

// 	// Check initial params
// 	communityParamsResInitial, err := suite.ZgChain.Grpc.Query.Community.Params(
// 		context.Background(),
// 		&communitytypes.QueryParamsRequest{},
// 	)
// 	suite.Require().NoError(err)

// 	// setup 0g account
// 	// .1 A0GI + min deposit amount for proposal
// 	funds := sdk.NewCoins(a0gi(1e5)).Add(govParamsRes.DepositParams.MinDeposit...)
// 	zgChainAcc := suite.ZgChain.NewFundedAccount("community-update-params", funds)

// 	gasLimit := int64(2e5)
// 	fee := a0gi(200)

// 	// Wait until switchover actually happens - When testing without the upgrade
// 	// handler that sets a relative switchover time, the switchover time in
// 	// genesis should be set in the past so it runs immediately.
// 	suite.Require().Eventually(
// 		func() bool {
// 			params, err := suite.ZgChain.Grpc.Query.Community.Params(
// 				context.Background(),
// 				&communitytypes.QueryParamsRequest{},
// 			)
// 			suite.Require().NoError(err)

// 			return params.Params.UpgradeTimeDisableInflation.Equal(time.Time{})
// 		},
// 		20*time.Second,
// 		1*time.Second,
// 		"switchover should happen",
// 	)

// 	// Add 1 to the staking rewards per second
// 	newStakingRewardsPerSecond := communityParamsResInitial.Params.
// 		StakingRewardsPerSecond.
// 		Add(sdkmath.LegacyNewDec(1))

// 	// 1. Proposal
// 	// Only modify stakingRewardsPerSecond, as to not re-run the switchover and
// 	// to not influence other tests
// 	updateParamsMsg := communitytypes.NewMsgUpdateParams(
// 		authtypes.NewModuleAddress(govtypes.ModuleName), // authority
// 		communitytypes.NewParams(
// 			time.Time{},                // after switchover, is empty
// 			newStakingRewardsPerSecond, // only modify stakingRewardsPerSecond
// 			communityParamsResInitial.Params.UpgradeTimeSetStakingRewardsPerSecond,
// 		),
// 	)

// 	// Make sure we're actually changing the params
// 	suite.NotEqual(
// 		updateParamsMsg.Params,
// 		communityParamsResInitial.Params,
// 		"new params should be different from existing",
// 	)

// 	proposalMsg, err := govv1.NewMsgSubmitProposal(
// 		[]sdk.Msg{&updateParamsMsg},
// 		govParamsRes.Params.MinDeposit,
// 		zgChainAcc.SdkAddress.String(),
// 		"community-update-params",
// 		"title",
// 		"summary",
// 	)
// 	suite.NoError(err)

// 	req := util.ZgChainMsgRequest{
// 		Msgs:      []sdk.Msg{proposalMsg},
// 		GasLimit:  uint64(gasLimit),
// 		FeeAmount: sdk.NewCoins(fee),
// 		Memo:      "this is a proposal please accept me",
// 	}
// 	res := zgChainAcc.SignAndBroadcastZgChainTx(req)
// 	suite.Require().NoError(res.Err)

// 	// Wait for proposal to be submitted
// 	txRes, err := util.WaitForSdkTxCommit(suite.ZgChain.Grpc.Query.Tx, res.Result.TxHash, 6*time.Second)
// 	suite.Require().NoError(err)

// 	// Parse tx response to get proposal id
// 	var govRes govv1.MsgSubmitProposalResponse
// 	suite.decodeTxMsgResponse(txRes, &govRes)

// 	// 2. Vote for proposal from whale account
// 	whale := suite.ZgChain.GetAccount(testutil.FundedAccountName)
// 	voteMsg := govv1.NewMsgVote(
// 		whale.SdkAddress,
// 		govRes.ProposalId,
// 		govv1.OptionYes,
// 		"",
// 	)

// 	voteReq := util.ZgChainMsgRequest{
// 		Msgs:      []sdk.Msg{voteMsg},
// 		GasLimit:  uint64(gasLimit),
// 		FeeAmount: sdk.NewCoins(fee),
// 		Memo:      "voting",
// 	}
// 	voteRes := whale.SignAndBroadcastZgChainTx(voteReq)
// 	suite.Require().NoError(voteRes.Err)

// 	_, err = util.WaitForSdkTxCommit(suite.ZgChain.Grpc.Query.Tx, voteRes.Result.TxHash, 6*time.Second)
// 	suite.Require().NoError(err)

// 	// 3. Wait until proposal passes
// 	suite.Require().Eventually(func() bool {
// 		proposalRes, err := suite.ZgChain.Grpc.Query.Gov.Proposal(context.Background(), &govv1.QueryProposalRequest{
// 			ProposalId: govRes.ProposalId,
// 		})
// 		suite.NoError(err)

// 		return proposalRes.Proposal.Status == govv1.StatusPassed
// 	}, 60*time.Second, 1*time.Second)

// 	// Check parameters are updated
// 	communityParamsRes, err := suite.ZgChain.Grpc.Query.Community.Params(
// 		context.Background(),
// 		&communitytypes.QueryParamsRequest{},
// 	)
// 	suite.Require().NoError(err)

// 	suite.Equal(updateParamsMsg.Params, communityParamsRes.Params)
// }

func (suite *IntegrationTestSuite) decodeTxMsgResponse(txRes *sdk.TxResponse, ptr codec.ProtoMarshaler) {
	// convert txRes.Data hex string to bytes
	txResBytes, err := hex.DecodeString(txRes.Data)
	suite.Require().NoError(err)

	// Unmarshal data to TxMsgData
	var txMsgData sdk.TxMsgData
	suite.ZgChain.EncodingConfig.Marshaler.MustUnmarshal(txResBytes, &txMsgData)
	suite.T().Logf("txData.MsgResponses: %v", txMsgData.MsgResponses)

	// Parse MsgResponse
	suite.ZgChain.EncodingConfig.Marshaler.MustUnmarshal(txMsgData.MsgResponses[0].Value, ptr)
	suite.Require().NoError(err)
}