package ui

import "opslag.de/schobers/geom"

type RenderBufferFn func(ctx Context, size geom.PointF32)

type Buffer struct {
	im   Image
	size geom.PointF32
}

func (b *Buffer) Update(ctx Context, size geom.PointF32) error {
	if b.im != nil {
		if size == b.size {
			return nil
		}
		b.im.Destroy()
		b.im = nil
		b.size = geom.ZeroPtF32
	}
	im, err := ctx.Renderer().CreateImageSize(size.X, size.Y)
	if err != nil {
		return err
	}
	b.im = im
	b.size = size
	return nil
}

func (b *Buffer) Render(ctx Context, pos geom.PointF32, fn RenderBufferFn) {
	if b.im == nil {
		return
	}
	renderer := ctx.Renderer()
	currTarget := renderer.Target()
	renderer.RenderTo(b.im)
	fn(ctx, b.size)
	renderer.RenderTo(currTarget)
	renderer.DrawImage(b.im, pos)
}

type BufferControl struct {
	ControlBase

	buffer Buffer
}

func (c *BufferControl) Arrange(ctx Context, bounds geom.RectangleF32, offset geom.PointF32) {
	c.ControlBase.Arrange(ctx, bounds, offset)
	c.buffer.Update(ctx, bounds.Size())
}

func (c *BufferControl) Render(ctx Context) {
	c.RenderFn(ctx, c.RenderBuffer)
}

func (c *BufferControl) RenderFn(ctx Context, render RenderBufferFn) {
	c.buffer.Render(ctx, c.bounds.Min, render)
}

func (c *BufferControl) RenderBuffer(ctx Context, size geom.PointF32) {}