package views

import (
	"image"

	"git.milar.in/milarin/gui"
)

// MarginView is a gui.Wrapper which applies margin around its view
type MarginView struct {
	gui.WrapperTmpl
	Margin map[gui.Side]int
}

var _ gui.Wrapper = &MarginView{}

func NewMarginView(view gui.View, top, right, bottom, left int) *MarginView {
	v := new(MarginView)
	v.SetView(view)
	v.SetMargin(top, right, bottom, left)
	return v
}

func (v *MarginView) Layout(ctx gui.AppContext) (prefWidth, prefHeight int) {
	w, h := v.View().Layout(ctx)
	w = iff(w > 0, w+v.Margin[gui.SideLeft]+v.Margin[gui.SideRight], w)
	h = iff(h > 0, h+v.Margin[gui.SideTop]+v.Margin[gui.SideBottom], h)
	return w, h
}

func (g *MarginView) Draw(img *gui.Image, ctx gui.AppContext) {
	x := img.Bounds().Min.X + g.Margin[gui.SideLeft]
	y := img.Bounds().Min.Y + g.Margin[gui.SideTop]
	w := img.Bounds().Max.X - g.Margin[gui.SideRight]
	h := img.Bounds().Max.Y - g.Margin[gui.SideBottom]

	g.ViewTmpl.Draw(img, ctx)
	g.View().Draw(img.SubImage(image.Rect(x, y, w, h)).(*gui.Image), ctx)
}

func (v *MarginView) SetMargin(top, right, bottom, left int) {
	v.Margin = map[gui.Side]int{
		gui.SideTop:    top,
		gui.SideRight:  right,
		gui.SideBottom: bottom,
		gui.SideLeft:   left,
	}
}
