package controlplane

import "fmt"

// validTransitions defines the allowed phase transitions.
var validTransitions = map[Phase][]Phase{
	PhaseCreated:          {PhasePreviewPending, PhasePreviewRunning, PhaseCanceled},
	PhasePreviewPending:   {PhasePreviewRunning, PhasePreviewSucceeded, PhasePreviewFailed, PhaseCanceled},
	PhasePreviewRunning:   {PhasePreviewSucceeded, PhasePreviewFailed, PhaseCanceled},
	PhasePreviewFailed:    {PhasePreviewPending, PhasePreviewRunning, PhaseCanceled}, // allow re-preview
	PhasePreviewSucceeded: {PhaseApproving, PhaseCanceled},
	PhaseApproving:        {PhaseApplyPending, PhaseApplyRunning, PhaseCanceled},
	PhaseApplyPending:     {PhaseApplyRunning, PhaseApplySucceeded, PhaseApplyFailed, PhaseCanceled},
	PhaseApplyRunning:     {PhaseApplySucceeded, PhaseApplyFailed, PhaseCanceled},
	PhaseApplyFailed:      {PhaseApplyPending, PhaseApplyRunning, PhaseCanceled}, // allow retry
}

// ValidateTransition checks whether moving from `from` to `to` is allowed.
func ValidateTransition(from, to Phase) error {
	targets, ok := validTransitions[from]
	if !ok {
		return fmt.Errorf("phase %q has no valid transitions (terminal state)", from)
	}
	for _, t := range targets {
		if t == to {
			return nil
		}
	}
	return fmt.Errorf("invalid phase transition from %q to %q", from, to)
}
