package sealtasks

type TaskType string

const (
	TTAddPiece   TaskType = "seal/v0/addpiece"
	TTPreCommit1 TaskType = "seal/v0/precommit/1"
	TTPreCommit2 TaskType = "seal/v0/precommit/2"
	TTCommit1    TaskType = "seal/v0/commit/1"
	TTCommit2    TaskType = "seal/v0/commit/2"

	TTFinalize TaskType = "seal/v0/finalize"

	TTFetch  TaskType = "seal/v0/fetch"
	TTUnseal TaskType = "seal/v0/unseal"

	TTReplicaUpdate         TaskType = "seal/v0/replicaupdate"
	TTProveReplicaUpdate1   TaskType = "seal/v0/provereplicaupdate/1"
	TTProveReplicaUpdate2   TaskType = "seal/v0/provereplicaupdate/2"
	TTRegenSectorKey        TaskType = "seal/v0/regensectorkey"
	TTFinalizeReplicaUpdate TaskType = "seal/v0/finalize/replicaupdate"
)

var order = map[TaskType]int{
	TTRegenSectorKey:      10, // least priority
	TTAddPiece:            9,
	TTReplicaUpdate:       8,
	TTProveReplicaUpdate2: 7,
	TTProveReplicaUpdate1: 6,
	TTPreCommit1:          5,
	TTPreCommit2:          4,
	TTCommit2:             3,
	TTCommit1:             2,
	TTUnseal:              1,
	TTFetch:               -1,
	TTFinalize:            -2, // most priority
}

var shortNames = map[TaskType]string{
	TTAddPiece: "AP",

	TTPreCommit1: "PC1",
	TTPreCommit2: "PC2",
	TTCommit1:    "C1",
	TTCommit2:    "C2",

	TTFinalize: "FIN",

	TTFetch:  "GET",
	TTUnseal: "UNS",

	TTReplicaUpdate:         "RU",
	TTProveReplicaUpdate1:   "PR1",
	TTProveReplicaUpdate2:   "PR2",
	TTRegenSectorKey:        "GSK",
	TTFinalizeReplicaUpdate: "FRU",
}

func (a TaskType) MuchLess(b TaskType) (bool, bool) {
	oa, ob := order[a], order[b]
	oneNegative := oa^ob < 0
	return oneNegative, oa < ob
}

func (a TaskType) Less(b TaskType) bool {
	return order[a] < order[b]
}

func (a TaskType) Short() string {
	n, ok := shortNames[a]
	if !ok {
		return "UNK"
	}

	return n
}
