package desktop

import (
	"syscall"
)

// Windows API constants
const (
	SRCCOPY            = 0x00CC0020
	CAPTUREBLT         = 0x40000000
	BI_RGB             = 0
	DIB_RGB_COLORS     = 0
	SM_CXSCREEN        = 0
	SM_CYSCREEN        = 1
	SM_XVIRTUALSCREEN  = 76
	SM_YVIRTUALSCREEN  = 77
	SM_CXVIRTUALSCREEN = 78
	SM_CYVIRTUALSCREEN = 79
	PW_CLIENTONLY      = 1
	PW_RENDERFULLCONTENT = 2
)

// Windows DLLs
var (
	user32DLL   = syscall.NewLazyDLL("user32.dll")
	gdi32DLL    = syscall.NewLazyDLL("gdi32.dll")
	kernel32DLL = syscall.NewLazyDLL("kernel32.dll")
	waborDLL    = syscall.NewLazyDLL("wtsapi32.dll")
)

// User32 procedures
var (
	procSetCursorPos     = user32DLL.NewProc("SetCursorPos")
	procGetCursorPos     = user32DLL.NewProc("GetCursorPos")
	procSendInput        = user32DLL.NewProc("SendInput")
	procGetSystemMetrics = user32DLL.NewProc("GetSystemMetrics")
	procKeybd_event      = user32DLL.NewProc("keybd_event")
	procMouse_event      = user32DLL.NewProc("mouse_event")
	procGetDC            = user32DLL.NewProc("GetDC")
	procGetWindowDC      = user32DLL.NewProc("GetWindowDC")
	procGetDesktopWindow = user32DLL.NewProc("GetDesktopWindow")
	procReleaseDC        = user32DLL.NewProc("ReleaseDC")
	procPrintWindow      = user32DLL.NewProc("PrintWindow")
)

// GDI32 procedures
var (
	procCreateCompatibleDC     = gdi32DLL.NewProc("CreateCompatibleDC")
	procCreateCompatibleBitmap = gdi32DLL.NewProc("CreateCompatibleBitmap")
	procSelectObject           = gdi32DLL.NewProc("SelectObject")
	procBitBlt                 = gdi32DLL.NewProc("BitBlt")
	procDeleteObject           = gdi32DLL.NewProc("DeleteObject")
	procDeleteDC               = gdi32DLL.NewProc("DeleteDC")
	procGetDIBits              = gdi32DLL.NewProc("GetDIBits")
)

// BITMAPINFOHEADER - Windows bitmap bilgi başlığı
type BITMAPINFOHEADER struct {
	BiSize          uint32
	BiWidth         int32
	BiHeight        int32
	BiPlanes        uint16
	BiBitCount      uint16
	BiCompression   uint32
	BiSizeImage     uint32
	BiXPelsPerMeter int32
	BiYPelsPerMeter int32
	BiClrUsed       uint32
	BiClrImportant  uint32
}

// BITMAPINFO - Windows bitmap bilgisi
type BITMAPINFO struct {
	BmiHeader BITMAPINFOHEADER
	BmiColors [1]uint32
}

// WTS (Windows Terminal Services) procedures - Session 0 desteği için
var (
	procWTSGetActiveConsoleSessionId = kernel32DLL.NewProc("WTSGetActiveConsoleSessionId")
	procWTSQueryUserToken            = waborDLL.NewProc("WTSQueryUserToken")
	procCreateDCA                    = gdi32DLL.NewProc("CreateDCA")
	procDeleteDCA                    = gdi32DLL.NewProc("DeleteDC")
)

// OpenInputDesktop ve SetThreadDesktop - Desktop switching için
var (
	procOpenInputDesktop  = user32DLL.NewProc("OpenInputDesktop")
	procCloseDesktop      = user32DLL.NewProc("CloseDesktop")
	procSetThreadDesktop  = user32DLL.NewProc("SetThreadDesktop")
	procGetThreadDesktop  = user32DLL.NewProc("GetThreadDesktop")
	procGetCurrentThreadId = kernel32DLL.NewProc("GetCurrentThreadId")
)

// Desktop access flags
const (
	DESKTOP_READOBJECTS  = 0x0001
	DESKTOP_CREATEWINDOW = 0x0002
	DESKTOP_CREATEMENU   = 0x0004
	DESKTOP_HOOKCONTROL  = 0x0008
	DESKTOP_JOURNALRECORD = 0x0010
	DESKTOP_JOURNALPLAYBACK = 0x0020
	DESKTOP_ENUMERATE    = 0x0040
	DESKTOP_WRITEOBJECTS = 0x0080
	DESKTOP_SWITCHDESKTOP = 0x0100
	GENERIC_ALL          = 0x10000000
)
