package main

import (
	"bufio"
	"context"
	"fmt"
	"os"
	"strings"

	"github.com/VictoriaMetrics/VictoriaMetrics/app/vmctl/terminal"
	"github.com/VictoriaMetrics/VictoriaMetrics/app/vmctl/vm"
)

const barTpl = `{{ blue "%s:" }} {{ counters . }} {{ bar . "[" "█" (cycle . "█") "▒" "]" }} {{ percent . }}`

// isSilent should be inited in main
var isSilent bool

func prompt(ctx context.Context, question string) bool {
	if isSilent {
		return true
	}
	isTerminal := terminal.IsTerminal(int(os.Stdout.Fd()))
	if !isTerminal {
		return true
	}
	reader := bufio.NewReader(os.Stdin)
	fmt.Print(question, " [Y/n] ")

	answerCh := make(chan string, 1)
	errCh := make(chan error, 1)

	go func() {
		answer, err := reader.ReadString('\n')
		if err != nil {
			errCh <- err
			return
		}
		answerCh <- answer
	}()

	select {
	case <-ctx.Done():
		fmt.Println("\nCanceled.")
		return false
	case err := <-errCh:
		panic(err)
	case answer := <-answerCh:
		answer = strings.TrimSpace(strings.ToLower(answer))
		if answer == "" || answer == "yes" || answer == "y" {
			return true
		}
		return false
	}
}

func wrapErr(vmErr *vm.ImportError, verbose bool) error {
	var errTS string
	var maxTS, minTS int64
	for _, ts := range vmErr.Batch {
		if minTS < ts.Timestamps[0] || minTS == 0 {
			minTS = ts.Timestamps[0]
		}
		if maxTS < ts.Timestamps[len(ts.Timestamps)-1] {
			maxTS = ts.Timestamps[len(ts.Timestamps)-1]
		}
		if verbose {
			errTS += fmt.Sprintf("%s for timestamps range %d - %d\n",
				ts.String(), ts.Timestamps[0], ts.Timestamps[len(ts.Timestamps)-1])
		}
	}
	var verboseMsg string
	if !verbose {
		verboseMsg = "(enable `--verbose` output to get more details)"
	}
	if vmErr.Err == nil {
		return fmt.Errorf("%s\n\tLatest delivered batch for timestamps range %d - %d %s\n%s",
			vmErr.Err, minTS, maxTS, verboseMsg, errTS)
	}
	return fmt.Errorf("%s\n\tImporting batch failed for timestamps range %d - %d %s\n%s",
		vmErr.Err, minTS, maxTS, verboseMsg, errTS)
}
