use galactica_content::SpriteHandle;
use galactica_util::to_radians;
use nalgebra::{Point2, Vector2};

use super::SpriteRect;
use crate::{vertexbuffer::types::UiInstance, PositionAnchor, RenderState};

pub struct SpriteImage {
	parent: SpriteHandle,
	parent_position: Point2<f32>,
	parent_size: f32,

	inner: SpriteHandle,
	mask: SpriteHandle,
	rect: SpriteRect,
}

impl SpriteImage {
	pub fn new(
		parent: SpriteHandle,
		parent_position: Point2<f32>,
		parent_size: f32,
		inner: SpriteHandle,
		mask: SpriteHandle,
		rect: SpriteRect,
	) -> Self {
		return Self {
			parent,
			parent_position,
			parent_size,
			inner,
			mask,
			rect,
		};
	}

	/// Add this image to the gpu sprite buffer
	pub fn push_to_buffer(&self, state: &mut RenderState) {
		let h = self.parent_size;
		let w = self.parent.aspect * h;

		let zero = Point2::new(
			self.parent_position.x - (w / 2.0),
			self.parent_position.y + (h / 2.0),
		);

		let pos = zero + Vector2::new(self.rect.pos.x * w, -self.rect.pos.y * h);
		let dim = Vector2::new(self.rect.dim.x * w, self.rect.dim.y * h);

		state.push_ui_buffer(UiInstance {
			anchor: PositionAnchor::CNw.to_int(),
			position: pos.into(),
			angle: to_radians(90.0),
			size: dim.y,
			color: [1.0, 1.0, 1.0, 1.0],
			sprite_index: self.inner.get_index(),
			mask_index: [1, self.mask.get_index()],
		});
	}
}