// SPDX-FileCopyrightText: Amolith <amolith@secluded.site>
//
// SPDX-License-Identifier: AGPL-3.0-or-later

package lunatask

import (
	"errors"
	"fmt"
	"strings"
)

// Motivation represents why a task matters.
type Motivation string

// Valid motivation values.
const (
	// MotivationUnknown clears/unsets the motivation (default).
	MotivationUnknown Motivation = "unknown"
	MotivationMust    Motivation = "must"
	MotivationShould  Motivation = "should"
	MotivationWant    Motivation = "want"
)

// Errors returned by Motivation operations.
var (
	// ErrInvalidMotivation is returned when parsing an unknown motivation string.
	ErrInvalidMotivation = errors.New("invalid motivation")
)

// String returns the motivation value as a string.
func (m Motivation) String() string {
	return string(m)
}

// AllMotivations returns all valid motivation values.
// Includes [MotivationUnknown] which clears/unsets motivation.
func AllMotivations() []Motivation {
	return []Motivation{
		MotivationUnknown,
		MotivationMust,
		MotivationShould,
		MotivationWant,
	}
}

// ParseMotivation parses a string to a Motivation value (case-insensitive).
// Valid values: "unknown", "must", "should", "want".
func ParseMotivation(str string) (Motivation, error) {
	switch strings.ToLower(str) {
	case "unknown":
		return MotivationUnknown, nil
	case "must":
		return MotivationMust, nil
	case "should":
		return MotivationShould, nil
	case "want":
		return MotivationWant, nil
	default:
		return "", fmt.Errorf("%w: %q", ErrInvalidMotivation, str)
	}
}
