/*
Copyright © 2024 Brian Buller <brian@bullercodeworks.com>
*/
package util

import (
	"bufio"
	"fmt"
	"os"
	"strconv"
	"strings"
	"syscall"

	//"golang.design/x/clipboard"
	"github.com/atotto/clipboard"
	"golang.org/x/term"
)

func WriteToClipboard(val string) error {
	clipboard.WriteAll(val)
	return nil
}

/*
func WriteToClipboard(val string) error {
	return WriteToClipboardWithTimeout(val, time.Second*5)
}
func WriteToClipboardWithTimeout(val string, timeout time.Duration) error {
	ct := make(chan struct{})
	go func() {
		time.Sleep(timeout)
		ct <- struct{}{}
	}()
	select {
	case <-clipboard.Write(clipboard.FmtText, []byte(val)):
		fmt.Println("Clipboard Changed")
	case <-ct:
		fmt.Println("Clipboard Cleared")
	}
	return nil
}
*/

func PromptUserForPassword(label string) (string, error) {
	fmt.Println(label)
	bytePass, err := term.ReadPassword(int(syscall.Stdin))
	if err != nil {
		return "", err
	}
	return string(bytePass), nil
}
func PromptUser(text string) string {
	var resp string
	fmt.Println(text)
	scanner := bufio.NewScanner(os.Stdin)
	if scanner.Scan() {
		resp = scanner.Text()
	}
	return resp
}

func PromptUserOptTrimmed(text string, def string) string {
	var resp string
	if def == "" {
		resp = strings.TrimSpace(PromptUser(text))
	} else {
		resp = strings.TrimSpace(PromptUser(fmt.Sprintf("%s [%s]:", text, def)))
		if resp == "" {
			resp = def
		}
	}
	for resp == "" {
		resp = strings.TrimSpace(PromptUser(text))
		if resp == "" {
			fmt.Println("Cannot be blank")
		}
	}
	return resp
}

func PromptUserTrimmed(text string) string {
	return PromptUserOptTrimmed(text, "")
}

func PromptUserInt(text string) int {
	var resp string
	var i int
	for resp == "" {
		resp = strings.TrimSpace(PromptUser(text))
		if resp == "" {
			fmt.Println("Cannot be blank")
		}
		var err error
		i, err = strconv.Atoi(resp)
		if err != nil {
			fmt.Println("Must be a number")
			resp = ""
		}
	}
	return i
}
