package utils

import (
	"bufio"
	"fmt"
	"os"
	"os/exec"
	"os/signal"
	"regexp"
	"strings"
	"github.com/manifoldco/promptui"
)

// MenuOption represents an option in the menu
type MenuOption struct {
	Display string
	Value   string
}

// CheckGit checks if Git is installed and available in PATH
func CheckGit() bool {
	_, err := exec.LookPath("git")
	return err == nil
}


// Slugify converts a string into a slug suitable for filenames and URLs
func Slugify(name string) string {
	// Convert to lowercase, remove non-alphanumeric characters, and replace spaces with hyphens
	re := regexp.MustCompile("[^a-z0-9]+")
	slug := re.ReplaceAllString(strings.ToLower(name), "-")
	slug = strings.Trim(slug, "-")
	return slug
}

// PromptIfEmpty prompts the user for input if the given variable is empty
func PromptIfEmpty(value *string, prompt string) {
	if *value == "" {
		reader := bufio.NewReader(os.Stdin)
		fmt.Print(prompt)
		input, _ := reader.ReadString('\n')
		*value = strings.TrimSpace(input)
	}
}

// SelectMenu displays a menu with options and returns the selected value
func SelectMenu(options []MenuOption, prompt string) (string, error) {
	// Handle interrupt signal (Ctrl+C)
	c := make(chan os.Signal, 1)
	signal.Notify(c, os.Interrupt)

	go func() {
		<-c
		fmt.Println("\nAborted by user")
		os.Exit(1)
	}()

	promptItems := make([]string, len(options))
	for i, option := range options {
		promptItems[i] = option.Display
	}

	promptUI := promptui.Select{
		Label: prompt,
		Items: promptItems,
	}

	_, result, err := promptUI.Run()
	if err != nil {
		return "", err
	}

	for _, option := range options {
		if option.Display == result {
			return option.Value, nil
		}
	}

	return "", nil
}