/*
Copyright © 2023 Philipp Wolfer <phw@uploadedlobster.com>

Scotty is free software: you can redistribute it and/or modify it under the
terms of the GNU General Public License as published by the Free Software
Foundation, either version 3 of the License, or (at your option) any later version.

Scotty is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
A PARTICULAR PURPOSE. See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with
Scotty. If not, see <https://www.gnu.org/licenses/>.
*/

package cli

import (
	"fmt"

	"github.com/manifoldco/promptui"
	"go.uploadedlobster.com/scotty/internal/i18n"
	"go.uploadedlobster.com/scotty/internal/models"
)

func Prompt(opt models.BackendOption) (any, error) {
	switch opt.Type {
	case models.Bool:
		return PromptBool(opt)
	case models.Secret:
		return PromptSecret(opt)
	case models.String:
		return PromptString(opt)
	default:
		return nil, fmt.Errorf("unknown prompt type %v", opt.Type)
	}
}

func PromptString(opt models.BackendOption) (string, error) {
	prompt := promptui.Prompt{
		Label:    opt.Label,
		Validate: opt.Validate,
		Default:  opt.Default,
	}

	val, err := prompt.Run()
	return val, err
}

func PromptSecret(opt models.BackendOption) (string, error) {
	prompt := promptui.Prompt{
		Label:    opt.Label,
		Validate: opt.Validate,
		Default:  opt.Default,
		Mask:     '*',
	}

	val, err := prompt.Run()
	return val, err
}

func PromptBool(opt models.BackendOption) (bool, error) {
	return PromptYesNo(opt.Label, opt.Default == "true")
}

func PromptYesNo(label string, defaultValue bool) (bool, error) {
	yes := i18n.Tr("Yes")
	no := i18n.Tr("No")
	selected := 1
	if defaultValue {
		selected = 0
	}
	sel := promptui.Select{
		Label:     label,
		Items:     []string{yes, no},
		CursorPos: selected,
	}
	_, val, err := sel.Run()
	return val == yes, err
}