package main

import (
	"go.wit.com/widget"
)

func (tk *guiWidget) Size() (int, int) {
	if tk == nil {
		return 0, 0
	}
	if me.treeRoot == nil {
		return 0, 0
	}

	// don't count hidden widgets in size calculations
	if tk.node.Hidden() {
		return 0, 0
	}

	switch tk.WidgetType {
	case widget.Window:
		var maxH int = 0
		var maxW int = 0
		for _, child := range tk.children {
			if tk.node.Hidden() {
				continue
			}
			sizeW, sizeH := child.Size()
			maxW += sizeW
			if sizeH > maxH {
				maxH = sizeH
			}

		}
		return maxW, maxH
	case widget.Grid:
		return tk.sizeGrid()
	case widget.Box:
		return tk.sizeBox()
	case widget.Group:
		// move the group to the parent's next location
		maxW := tk.gocuiSize.Width()
		maxH := tk.gocuiSize.Height()

		for _, child := range tk.children {
			if tk.node.Hidden() {
				continue
			}
			sizeW, sizeH := child.Size()

			// increment straight down
			maxH += sizeH
			if sizeW > maxW {
				maxW = sizeW
			}
		}
		return maxW + me.GroupPadW + 3, maxH
	case widget.Label:
		return len(tk.String()) + 2, 1
	case widget.Checkbox:
		return len(tk.String()) + 2, 3
	}
	if tk.isFake {
		return 0, 0
	}
	return len(tk.String()), 3
}

func (w *guiWidget) sizeGrid() (int, int) {
	if w.node.Hidden() {
		return 0, 0
	}

	// first compute the max sizes of the rows and columns
	for _, child := range w.children {
		if w.node.Hidden() {
			continue
		}
		sizeW, sizeH := child.Size()

		sizeW += 2

		// set the child's realWidth, and grid offset
		if w.widths[child.node.State.AtW] < sizeW {
			w.widths[child.node.State.AtW] = sizeW
		}
		if w.heights[child.node.State.AtH] < sizeH {
			w.heights[child.node.State.AtH] = sizeH
		}
	}

	// find the width and height offset of the grid for AtW,AtH
	var totalW int = 0
	var totalH int = 0
	for _, width := range w.widths {
		totalW += width
	}
	for _, h := range w.heights {
		totalH += h
	}
	return totalW + me.GridPadW, totalH
}

func (w *guiWidget) sizeBox() (int, int) {
	if w.WidgetType != widget.Box {
		return 0, 0
	}
	if w.node.Hidden() {
		return 0, 0
	}
	var maxW int = 0
	var maxH int = 0

	for _, child := range w.children {
		if w.node.Hidden() {
			continue
		}
		sizeW, sizeH := child.Size()
		if child.node.State.Direction == widget.Vertical {
			maxW += sizeW
			if sizeH > maxH {
				maxH = sizeH
			}
		} else {
			maxH += sizeH
			if sizeW > maxW {
				maxW = sizeW
			}
		}
	}
	return maxW + me.BoxPadW, maxH
}