//go:build windows

package main

// Windows-only: with -H=windowsgui the binary is registered as a GUI
// subsystem app, so double-clicking from the Desktop shortcut does NOT
// spawn a console window (good for the desktop UX). The downside is that
// sub-commands like `muyue scan`, `muyue version`, `muyue install-shortcuts`
// produce no output when invoked from cmd.exe.
//
// Workaround: at process start, try to attach to the parent's console via
// kernel32!AttachConsole(ATTACH_PARENT_PROCESS). If the parent has a console
// (i.e. we were launched from cmd.exe / PowerShell), stdout/stderr/stdin are
// rebound to it. If not (Explorer double-click), the call fails silently and
// the binary runs without any console — exactly what we want.

import (
	"log"
	"os"
	"syscall"
)

const attachParentProcess = ^uint32(0) // -1 cast to DWORD

func init() {
	kernel32, err := syscall.LoadLibrary("kernel32.dll")
	if err != nil {
		return
	}
	defer syscall.FreeLibrary(kernel32)
	attachConsole, err := syscall.GetProcAddress(kernel32, "AttachConsole")
	if err != nil {
		return
	}
	r0, _, _ := syscall.SyscallN(attachConsole, uintptr(attachParentProcess))
	if r0 == 0 {
		return // parent has no console (Explorer launch) — stay silent
	}
	// Re-bind the standard streams to the freshly attached console so
	// fmt.Println / log output appear in the parent terminal.
	if h, err := syscall.GetStdHandle(syscall.STD_OUTPUT_HANDLE); err == nil && h != 0 {
		os.Stdout = os.NewFile(uintptr(h), "stdout")
	}
	if h, err := syscall.GetStdHandle(syscall.STD_ERROR_HANDLE); err == nil && h != 0 {
		os.Stderr = os.NewFile(uintptr(h), "stderr")
	}
	if h, err := syscall.GetStdHandle(syscall.STD_INPUT_HANDLE); err == nil && h != 0 {
		os.Stdin = os.NewFile(uintptr(h), "stdin")
	}
	// log.Default() captured the original os.Stderr at init time — repoint it
	// at the freshly attached console so log.Printf calls (e.g. desktop.Run)
	// surface in the parent terminal.
	log.SetOutput(os.Stderr)
}
