package gg

import (
	"github.com/hajimehoshi/ebiten/v2"
)

type Sprite struct {
	Transform
	ShaderOptions
	Floating, Visible bool
}

func (s *Sprite) Draw(
	e *Engine,
	i *Image,
) {
	// Nothing to draw.
	if s.Images[0] == nil {
		return
	}
	
	t := s.Rectangle().Transform
	m := &Matrix{}
	m.Concat(t.Matrix())
	if !s.Floating {
		m.Concat(e.Camera().RealMatrix(
			e,
		))
	}

	// Drawing without shader.
	if s.Shader == nil {
		opts := &ebiten.DrawImageOptions{}
		opts.GeoM = *m
		i.DrawImage(s.Images[0], opts)
		return
	}
	
	w, h := s.Images[0].Size()
	// Drawing with shader.
	opts := &ebiten.DrawRectShaderOptions{
		Images: s.Images,
		Uniforms: s.Uniforms,
		GeoM: *m,
	}
	i.DrawRectShader(w, h, s.Shader, opts)
}

// Check is sprite is visible.
func (s *Sprite) IsVisible() bool {
	return s.Visible
}

// Return the rectangle that contains the sprite.
func (s *Sprite) Rectangle() Rectangle {
	if s.Images[0] == nil {
		panic("trying to get rectangle for nil image pointer")
	}
	
	w, h := s.Images[0].Size()
	t := s.Transform
	t.RA.X *= Float(w)
	t.RA.Y *= Float(h)
	
	return Rectangle{t}
}

func (s *Sprite) Triangles() Triangles {
	return s.Rectangle().Triangles()
}