package widget

import (
	"fyne.io/fyne/v2"
)

// ShadowingRenderer is a renderer that adds a shadow around the rendered content.
// When using the ShadowingRenderer the embedding renderer should call
// LayoutShadow(contentSize, contentPos) to lay out the shadow.
type ShadowingRenderer struct {
	BaseRenderer
	shadow fyne.CanvasObject
}

// NewShadowingRenderer creates a ShadowingRenderer.
func NewShadowingRenderer(objects []fyne.CanvasObject, level ElevationLevel) *ShadowingRenderer {
	var s fyne.CanvasObject
	if level > 0 {
		s = NewShadow(ShadowAround, level)
	}
	r := &ShadowingRenderer{shadow: s}
	r.SetObjects(objects)
	return r
}

// LayoutShadow adjusts the size and position of the shadow if necessary.
func (r *ShadowingRenderer) LayoutShadow(size fyne.Size, pos fyne.Position) {
	if r.shadow == nil {
		return
	}
	r.shadow.Resize(size)
	r.shadow.Move(pos)
}

// SetObjects updates the renderer's objects including the shadow if necessary.
func (r *ShadowingRenderer) SetObjects(objects []fyne.CanvasObject) {
	if r.shadow != nil && len(objects) > 0 && r.shadow != objects[0] {
		objects = append([]fyne.CanvasObject{r.shadow}, objects...)
	}
	r.BaseRenderer.SetObjects(objects)
}

// RefreshShadow asks the shadow graphical element to update to current theme
func (r *ShadowingRenderer) RefreshShadow() {
	if r.shadow == nil {
		return
	}
	r.shadow.Refresh()
}
