//go:build ignore

// This program generates hashes.go. It can be invoked by running
// go generate.
package main

import (
	"fmt"
	"log"
	"os"
	"text/template"

	"git.marketally.com/tutus-one/tutus-chain/pkg/core/native/nativenames"
	"git.marketally.com/tutus-one/tutus-chain/pkg/core/state"
)

// srcTmpl is a nativehashes package template.
const srcTmpl = `// Code generated by "go generate go run gen.go"; DO NOT EDIT.

//go:generate go run gen.go

// package nativehashes contains hashes of all native contracts in their LE and Uint160 representation.
package nativehashes

import "git.marketally.com/tutus-one/tutus-chain/pkg/util"

// Hashes of all native contracts.
var (
{{- range .Natives }}
	// {{ .Name }} is a hash of native {{ .Name }} contract.
	{{ .Name }} = {{ .Hash }}
{{- end }}
)
`

type (
	// Config contains parameters for the nativehashes package generation.
	Config struct {
		Natives []NativeInfo
	}

	// NativeInfo contains information about native contract needed for
	// nativehashes package generation.
	NativeInfo struct {
		Name string
		Hash string
	}
)

// srcTemplate is a parsed nativehashes package template.
var srcTemplate = template.Must(template.New("nativehashes").Parse(srcTmpl))

func main() {
	f, err := os.Create("hashes.go")
	if err != nil {
		log.Fatal(err)
	}
	defer f.Close()

	var cfg = Config{Natives: make([]NativeInfo, len(nativenames.All))}
	for i, name := range nativenames.All {
		var hash = state.CreateNativeContractHash(name)
		cfg.Natives[i] = NativeInfo{
			Name: name,
			Hash: fmt.Sprintf("%#v", hash),
		}
	}

	srcTemplate.Execute(f, cfg)
}
