package main

import (
	"github.com/filecoin-project/go-state-types/abi"

	"github.com/filecoin-project/lotus/build"
)

// ProtocolCodenames is a table that summarises the protocol codenames that
// will be set on extracted vectors, depending on the original execution height.
//
// Implementers rely on these names to filter the vectors they can run through
// their implementations, based on their support level
var ProtocolCodenames = []struct {
	firstEpoch abi.ChainEpoch
	name       string
}{
	{0, "genesis"},
	{build.UpgradeBreezeHeight + 1, "breeze"},
	{build.UpgradeSmokeHeight + 1, "smoke"},
	{build.UpgradeIgnitionHeight + 1, "ignition"},
	{build.UpgradeRefuelHeight + 1, "refuel"},
	{build.UpgradeAssemblyHeight + 1, "actorsv2"},
	{build.UpgradeTapeHeight + 1, "tape"},
	{build.UpgradeLiftoffHeight + 1, "liftoff"},
	{build.UpgradeKumquatHeight + 1, "postliftoff"},
	{build.UpgradeCalicoHeight + 1, "calico"},
	{build.UpgradePersianHeight + 1, "persian"},
	{build.UpgradeOrangeHeight + 1, "orange"},
	{build.UpgradeTrustHeight + 1, "trust"},
	{build.UpgradeNorwegianHeight + 1, "norwegian"},
	{build.UpgradeTurboHeight + 1, "turbo"},
	{build.UpgradeHyperdriveHeight + 1, "hyperdrive"},
	{build.UpgradeChocolateHeight + 1, "chocolate"},
	{build.UpgradeOhSnapHeight + 1, "ohsnap"},
}

// GetProtocolCodename gets the protocol codename associated with a height.
func GetProtocolCodename(height abi.ChainEpoch) string {
	for i, v := range ProtocolCodenames {
		if height < v.firstEpoch {
			// found the cutoff, return previous.
			return ProtocolCodenames[i-1].name
		}
	}
	return ProtocolCodenames[len(ProtocolCodenames)-1].name
}