package common

import (
	"fmt"
	"strings"

	retry "github.com/avast/retry-go/v4"
)

// ValidateDMPrecheckState validates one observed precheck response. Failed
// checks and explicit terminal failure are unrecoverable; pending/running
// states remain ordinary polling errors for BaseCase.Expect.
func ValidateDMPrecheckState(state string, failedCount int32) error {
	if failedCount > 0 {
		return retry.Unrecoverable(fmt.Errorf("DM precheck has %d failed checks", failedCount))
	}
	switch strings.TrimPrefix(strings.ToUpper(strings.TrimSpace(state)), "STAGE_") {
	case "FINISHED", "SUCCEEDED", "SUCCESS", "COMPLETED":
		return nil
	case "FAILED", "CANCELED", "CANCELLED":
		return retry.Unrecoverable(fmt.Errorf("DM precheck reached terminal state %s", state))
	default:
		return fmt.Errorf("DM precheck state is %s", state)
	}
}

func ValidateDMState(state, expected string) error {
	if state == expected {
		return nil
	}
	switch state {
	case "FAILED", "CANCELED", "CANCELLED":
		return retry.Unrecoverable(fmt.Errorf("DM migration reached terminal state %s", state))
	default:
		return fmt.Errorf("DM migration state is %s", state)
	}
}
