package main

import (
	"go.wit.com/dev/andlabs/ui"
	_ "go.wit.com/dev/andlabs/ui/winmanifest"


	"go.wit.com/log"
	"go.wit.com/gui/widget"
)

// This routine is very specific to this toolkit
// It's annoying and has to be copied to each widget when there are changes
// it could be 'simplfied' maybe or made to be more generic, but this is as far as I've gotten
// it's probably not worth working much more on this toolkit, the andlabs/ui has been great and got me here!
// but it's time to write direct GTK, QT, macos and windows toolkit plugins
// -- jcarr 2023/03/09

// Grid numbering examples by (X,Y)
// ---------
// -- (1) --
// -- (2) --
// ---------
//
// -----------------------------
// -- (1,1) -- (1,2) -- (1,3) --
// -- (2,1) -- (2,2) -- (2,3) --
// -----------------------------

// internally for andlabs/ui
// (x&y flipped and start at zero) 
// -----------------------------
// -- (0,0) -- (1,0) -- (1,0) --
// -- (0,1) -- (1,1) -- (1,1) --
// -----------------------------
func (p *node) place(n *node) bool {
	log.Log(INFO, "place() START", n.WidgetType, n.progname)

	if (p.tk == nil) {
		log.Log(ERROR, "p.tk == nil", p.progname, p.ParentId, p.WidgetType, p.tk)
		log.Log(ERROR, "n = ", n.progname, n.ParentId, n.WidgetType, n.tk)
		panic("p.tk == nil")
	}

	log.Log(INFO, "place() switch", p.WidgetType)
	switch p.WidgetType {
	case widget.Grid:
		log.Log(INFO, "place() Grid try at Parent X,Y =", n.X, n.Y)
		n.tk.gridX = n.AtW - 1
		n.tk.gridY = n.AtH - 1
		log.Log(INFO, "place() Grid try at gridX,gridY", n.tk.gridX, n.tk.gridY)
		// at the very end, subtract 1 from X & Y since andlabs/ui starts counting at zero
		p.tk.uiGrid.Append(n.tk.uiControl,
			n.tk.gridX, n.tk.gridY, 1, 1,
			false, ui.AlignFill, false, ui.AlignFill)
		return true
	case widget.Group:
		if (p.tk.uiBox == nil) {
			log.Log(WARN, "place() andlabs hack group to use add a box", n.progname, n.WidgetType)
			p.tk.uiBox  = n.rawBox()
			p.tk.uiGroup.SetChild(p.tk.uiBox)
		}
		p.tk.uiBox.Append(n.tk.uiControl, stretchy)
		return true
	case widget.Tab:
		if (p.tk.uiTab == nil) {
			log.Log(ERROR, "p.tk.uiTab == nil for n.WidgetId =", n.WidgetId, "p.tk =", p.tk)
			panic("p.tk.uiTab == nil")
		}
		if (n.tk.uiControl == nil) {
			log.Log(ERROR, "n.tk.uiControl == nil for n.WidgetId =", n.WidgetId, "n.tk =", n.tk)
			panic("n.tk.uiControl == nil")
		}
		log.Log(ERROR, "CHECK LOGIC ON THIS. APPENDING directly into a window without a tab")
		// log.Log(ERROR, "THIS SHOULD NEVER HAPPEN ??????? trying to place() node=", n.WidgetId, n.progname, n.Text, n.WidgetType)
		// log.Log(ERROR, "THIS SHOULD NEVER HAPPEN ??????? trying to place() on parent=", p.WidgetId, p.progname, p.Text, p.WidgetType)
		// panic("n.tk.uiControl == nil")
		p.tk.uiTab.Append(getString(n.value), n.tk.uiControl)
		p.tk.boxC += 1
		return true
	case widget.Box:
		log.Log(INFO, "place() uiBox =", p.tk.uiBox)
		log.Log(INFO, "place() uiControl =", n.tk.uiControl)
		p.tk.uiBox.Append(n.tk.uiControl, stretchy)
		p.tk.boxC += 1
		return true
	case widget.Window:
		p.tk.uiWindow.SetChild(n.tk.uiControl)
		return true
	default:
		log.Log(ERROR, "place() how? Parent =", p.WidgetId, p.WidgetType)
	}
	return false
}
