package types

import "fmt"

// NewGenesisState creates a new genesis state.
func NewGenesisState(
	params Params, pairs []TokenPair, denomIndexes []TokenPairDenomIndex, erc20AddrIndexes []TokenPairERC20AddressIndex,
) GenesisState {
	return GenesisState{
		Params:              params,
		TokenPairs:          pairs,
		DenomIndexes:        denomIndexes,
		Erc20AddressIndexes: erc20AddrIndexes,
	}
}

// DefaultGenesisState sets default evm genesis state with empty accounts and
// default params and chain config values.
func DefaultGenesisState() *GenesisState {
	return &GenesisState{
		Params: DefaultParams(),
	}
}

// Validate performs basic genesis state validation returning an error upon any
// failure.
func (gs GenesisState) Validate() error {
	seenErc20 := make(map[string]bool)
	seenDenom := make(map[string]bool)

	for _, b := range gs.TokenPairs {
		if seenErc20[b.Erc20Address] {
			return fmt.Errorf("token ERC20 contract duplicated on genesis '%s'", b.Erc20Address)
		}
		if seenDenom[b.Denom] {
			return fmt.Errorf("coin denomination duplicated on genesis: '%s'", b.Denom)
		}

		if err := b.Validate(); err != nil {
			return err
		}

		seenErc20[b.Erc20Address] = true
		seenDenom[b.Denom] = true
	}

	return gs.Params.Validate()
}
