package main

import (
	"log"
	"os"

	"github.com/iotaledger/goshimmer/dapps/valuetransfers/packages/balance"
	"github.com/iotaledger/goshimmer/dapps/valuetransfers/packages/tangle"
	"github.com/iotaledger/goshimmer/dapps/valuetransfers/packages/transaction"
	"github.com/iotaledger/goshimmer/dapps/valuetransfers/packages/wallet"
	flag "github.com/spf13/pflag"
	"github.com/spf13/viper"
)

const (
	cfgGenesisTokenAmount   = "token-amount"
	cfgSnapshotFileName     = "snapshot-file"
	defaultSnapshotFileName = "./snapshot.bin"
)

func init() {
	flag.Int(cfgGenesisTokenAmount, 1000000000000000, "the amount of tokens to add to the genesis output")
	flag.String(cfgSnapshotFileName, defaultSnapshotFileName, "the name of the generated snapshot file")
}

func main() {
	flag.Parse()
	if err := viper.BindPFlags(flag.CommandLine); err != nil {
		panic(err)
	}
	genesisTokenAmount := viper.GetInt64(cfgGenesisTokenAmount)
	snapshotFileName := viper.GetString(cfgSnapshotFileName)
	log.Printf("creating snapshot %s...", snapshotFileName)

	genesisWallet := wallet.New()
	genesisAddress := genesisWallet.Seed().Address(0)

	log.Println("genesis:")
	log.Printf("-> seed (base58): %s", genesisWallet.Seed().String())
	log.Printf("-> output address (base58): %s", genesisAddress.String())
	log.Printf("-> output id (base58): %s", transaction.NewOutputID(genesisAddress, transaction.GenesisID))
	log.Printf("-> token amount: %d", genesisTokenAmount)

	snapshot := tangle.Snapshot{
		transaction.GenesisID: {
			genesisAddress: {
				balance.New(balance.ColorIOTA, genesisTokenAmount),
			},
		},
	}

	f, err := os.OpenFile(snapshotFileName, os.O_RDWR|os.O_CREATE, 0666)
	if err != nil {
		log.Fatal("unable to create snapshot file", err)
	}
	defer f.Close()

	if _, err = snapshot.WriteTo(f); err != nil {
		log.Fatal("unable to write snapshot content to file", err)
	}

	log.Printf("created %s, bye", snapshotFileName)
}