package v4_test

import (
	"encoding/json"
	"testing"

	"github.com/stretchr/testify/require"

	"git.cw.tr/mukan-network/mukan-sdk/client"
	moduletestutil "git.cw.tr/mukan-network/mukan-sdk/types/module/testutil"
	"git.cw.tr/mukan-network/mukan-sdk/x/gov"
	v4 "git.cw.tr/mukan-network/mukan-sdk/x/gov/migrations/v4"
	v1 "git.cw.tr/mukan-network/mukan-sdk/x/gov/types/v1"
)

func TestMigrateJSON(t *testing.T) {
	encodingConfig := moduletestutil.MakeTestEncodingConfig(gov.AppModuleBasic{})
	clientCtx := client.Context{}.
		WithInterfaceRegistry(encodingConfig.InterfaceRegistry).
		WithTxConfig(encodingConfig.TxConfig).
		WithCodec(encodingConfig.Codec)

	govGenState := v1.DefaultGenesisState()
	oldGovState := &v1.GenesisState{
		StartingProposalId: govGenState.StartingProposalId,
		Deposits:           govGenState.Deposits,
		Votes:              govGenState.Votes,
		Proposals:          govGenState.Proposals,
		DepositParams: &v1.DepositParams{
			MinDeposit:       govGenState.Params.MinDeposit,
			MaxDepositPeriod: govGenState.Params.MaxDepositPeriod,
		},
		VotingParams: &v1.VotingParams{
			VotingPeriod: govGenState.Params.VotingPeriod,
		},
		TallyParams: &v1.TallyParams{
			Quorum:        govGenState.Params.Quorum,
			Threshold:     govGenState.Params.Threshold,
			VetoThreshold: govGenState.Params.VetoThreshold,
		},
	}

	migrated, err := v4.MigrateJSON(oldGovState)
	require.NoError(t, err)
	require.Equal(t, migrated, govGenState)

	bz, err := clientCtx.Codec.MarshalJSON(migrated)
	require.NoError(t, err)

	// Indent the JSON bz correctly.
	var jsonObj map[string]any
	err = json.Unmarshal(bz, &jsonObj)
	require.NoError(t, err)
	indentedBz, err := json.MarshalIndent(jsonObj, "", "\t")
	require.NoError(t, err)

	// Make sure about:
	// - Proposals use MsgExecLegacyContent
	expected := `{
	"constitution": "",
	"deposit_params": null,
	"deposits": [],
	"params": {
		"burn_proposal_deposit_prevote": false,
		"burn_vote_quorum": false,
		"burn_vote_veto": true,
		"expedited_min_deposit": [
			{
				"amount": "50000000",
				"denom": "stake"
			}
		],
		"expedited_threshold": "0.667000000000000000",
		"expedited_voting_period": "86400s",
		"max_deposit_period": "172800s",
		"min_deposit": [
			{
				"amount": "10000000",
				"denom": "stake"
			}
		],
		"min_deposit_ratio": "0.010000000000000000",
		"min_initial_deposit_ratio": "0.000000000000000000",
		"proposal_cancel_dest": "",
		"proposal_cancel_ratio": "0.500000000000000000",
		"quorum": "0.334000000000000000",
		"threshold": "0.500000000000000000",
		"veto_threshold": "0.334000000000000000",
		"voting_period": "172800s"
	},
	"proposals": [],
	"starting_proposal_id": "1",
	"tally_params": null,
	"votes": [],
	"voting_params": null
}`

	require.Equal(t, expected, string(indentedBz))
}
