package cmd

import (
	"fmt"

	"github.com/kubeasy-dev/kubeasy-cli/internal/api"
	"github.com/kubeasy-dev/kubeasy-cli/internal/audit"
	"github.com/kubeasy-dev/kubeasy-cli/internal/logger"
	"github.com/kubeasy-dev/kubeasy-cli/internal/ui"
	"github.com/spf13/cobra"
)

// getChallengeFn allows tests to inject a fake getChallenge implementation.
var getChallengeFn = getChallenge

var resetChallengeCmd = &cobra.Command{
	Use:   "reset [challenge-slug]",
	Short: "Reset a challenge",
	Long:  `Resets a challenge by removing challenge namespace and resetting progress and submissions`,
	Args:  cobra.ExactArgs(1),
	RunE: func(cmd *cobra.Command, args []string) error {
		challengeSlug := args[0]

		// Align with clean.go: validate slug before any API or cluster call
		if err := validateChallengeSlug(challengeSlug); err != nil {
			return err
		}

		ui.Section(fmt.Sprintf("Resetting Challenge: %s", challengeSlug))

		// Verify challenge exists
		_, err := getChallengeFn(challengeSlug)
		if err != nil {
			ui.Error(err.Error())
			return err
		}

		// Delete resources
		if err := deleteChallengeResources(cmd.Context(), challengeSlug); err != nil {
			return err
		}

		// Reset progress on server
		err = ui.WaitMessage("Resetting challenge progress on server", func() error {
			result, err := api.ResetChallenge(cmd.Context(), challengeSlug)
			if err != nil {
				return err
			}
			if !result.Success {
				return fmt.Errorf("reset failed: %s", result.Message)
			}
			return nil
		})
		if err != nil {
			ui.Error("Failed to reset challenge progress")
			return fmt.Errorf("failed to reset challenge progress: %w", err)
		}

		if err := audit.ClearState(challengeSlug); err != nil {
			logger.Debug("Could not clear audit state: %v", err)
		}

		ui.Println()
		ui.Success(fmt.Sprintf("Challenge '%s' reset successfully!", challengeSlug))
		ui.Info("You can start the challenge again with 'kubeasy challenge start " + challengeSlug + "'")

		return nil
	},
}

func init() {
	challengeCmd.AddCommand(resetChallengeCmd)
}
