/*
Copyright (c) Edgeless Systems GmbH

SPDX-License-Identifier: AGPL-3.0-only
*/

package role

import (
	"encoding/json"
	"strings"
)

//go:generate stringer -type=Role

// Role is a peer's role.
type Role uint

const (
	// Unknown is the default value for Role and should have no meaning.
	Unknown Role = iota
	// ControlPlane declares this node as a Kubernetes control plane node.
	ControlPlane
	// Worker declares this node as a Kubernetes worker node.
	Worker
)

// TFString returns the role as a string for Terraform.
func (r Role) TFString() string {
	switch r {
	case ControlPlane:
		return "control-plane"
	case Worker:
		return "worker"
	default:
		return "unknown"
	}
}

// MarshalJSON marshals the Role to JSON string.
func (r Role) MarshalJSON() ([]byte, error) {
	return json.Marshal(r.String())
}

// UnmarshalJSON unmarshals the Role from JSON string.
func (r *Role) UnmarshalJSON(b []byte) error {
	var roleString string
	if err := json.Unmarshal(b, &roleString); err != nil {
		return err
	}
	*r = FromString(roleString)
	return nil
}

// FromString returns the Role for the given string.
func FromString(s string) Role {
	switch strings.ToLower(s) {
	case "controlplane", "control-plane":
		return ControlPlane
	case "worker":
		return Worker
	default:
		return Unknown
	}
}