//go:build windows

package main

import (
	"bufio"
	"fmt"
	"os"
	"syscall"
	"unsafe"
)

const (
	enableLineInput = 0x0002
	enableEchoInput = 0x0004
)

var (
	kernel32           = syscall.NewLazyDLL("kernel32.dll")
	procGetConsoleMode = kernel32.NewProc("GetConsoleMode")
	procSetConsoleMode = kernel32.NewProc("SetConsoleMode")
)

// pressAnyKey waits for a single keypress, no Enter required. On a real
// console it temporarily disables line input so Read returns after one key;
// with piped input it reads one byte from the existing buffer.
func pressAnyKey(r *bufio.Reader, prompt string) {
	fmt.Print(prompt)
	if r == nil {
		r = bufio.NewReader(os.Stdin)
	}

	handle := syscall.Handle(os.Stdin.Fd())
	var mode uint32
	ok, _, _ := procGetConsoleMode.Call(uintptr(handle), uintptr(unsafe.Pointer(&mode)))
	if ok != 0 {
		procSetConsoleMode.Call(uintptr(handle), uintptr(mode&^ (enableLineInput|enableEchoInput)))
	}
	b, _ := r.ReadByte()
	if ok != 0 {
		if b == 0x00 || b == 0xE0 {
			_, _ = r.ReadByte()
		}
		procSetConsoleMode.Call(uintptr(handle), uintptr(mode))
	}
	fmt.Println()
}
