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

package lunatask

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

// TaskStatus represents the workflow state of a task.
type TaskStatus string

// Valid task status values.
const (
	// StatusLater is the default status for new tasks.
	StatusLater      TaskStatus = "later"
	StatusNext       TaskStatus = "next"
	StatusInProgress TaskStatus = "started"
	StatusWaiting    TaskStatus = "waiting"
	StatusCompleted  TaskStatus = "completed"
)

// Errors returned by TaskStatus operations.
var (
	// ErrInvalidTaskStatus is returned when parsing an unknown task status string.
	ErrInvalidTaskStatus = errors.New("invalid task status")
)

// String returns the task status value as a string.
func (s TaskStatus) String() string {
	return string(s)
}

// ParseTaskStatus parses a string to a TaskStatus value (case-insensitive).
// Valid values: "later", "next", "started", "in-progress", "waiting", "completed".
func ParseTaskStatus(str string) (TaskStatus, error) {
	switch strings.ToLower(str) {
	case "later":
		return StatusLater, nil
	case "next":
		return StatusNext, nil
	case "started", "in-progress":
		return StatusInProgress, nil
	case "waiting":
		return StatusWaiting, nil
	case "completed":
		return StatusCompleted, nil
	default:
		return "", fmt.Errorf("%w: %q", ErrInvalidTaskStatus, str)
	}
}
