// Copyright (c) 2023 Alex Diener. All rights reserved.

#include "PROJECT_NAME/Drawing.h"
#include "PROJECT_NAME/Globals.h"
#include "PROJECT_NAME/SharedDefinitions.h"
#include "PROJECT_NAME/Sprites.h"
#include "PROJECT_NAME/VisualEffect_sparkle.h"
#include "stem_core.h"

#define stemobject_implementation VisualEffect_sparkle

stemobject_vtable_begin();
stemobject_vtable_entry(dispose);
stemobject_vtable_entry(update);
stemobject_vtable_entry(isFinished);
stemobject_vtable_entry(writeVertices);
stemobject_vtable_end();

#define EFFECT_DURATION 0.3

VisualEffect_sparkle * VisualEffect_sparkle_create(Vector2i tilePosition) {
	stemobject_create_implementation(init, tilePosition)
}

bool VisualEffect_sparkle_init(VisualEffect_sparkle * self, Vector2i tilePosition) {
	call_super(init, self);
	self->tilePosition = tilePosition;
	self->elapsedTime = 0.0;
	return true;
}

void VisualEffect_sparkle_dispose(VisualEffect_sparkle * self) {
	call_super_virtual(dispose, self);
}

void VisualEffect_sparkle_update(VisualEffect_sparkle * self, double deltaTime) {
	self->elapsedTime += deltaTime;
}

bool VisualEffect_sparkle_isFinished(VisualEffect_sparkle * self) {
	return self->elapsedTime > EFFECT_DURATION;
}

void VisualEffect_sparkle_writeVertices(VisualEffect_sparkle * self, Vector2f offset, VertexIO * vertexIO) {
	Vector2f screenPosition = Vector2f_add(worldToScreenPosition(self->tilePosition), offset);
	struct {
		Vector2f offset;
		double timeOffset;
	} sparkles[] = {
		{{4.0f, -4.0f}, 0.0},
		{{12.0f, -4.0f}, 0.0625},
		{{4.0f, -12.0f}, 0.0625},
		{{12.0f, -12.0f}, 0.0}
	};
	Sprite * sprite = SpriteCollection_getSprite(g_spriteCollection, SPRITE_ID_SPARKLE);
	double animationLength = Sprite_getTotalDuration(sprite) / ANIMATION_FRAME_RATE;
	for (unsigned int sparkleIndex = 0; sparkleIndex < sizeof_count(sparkles); sparkleIndex++) {
		double sparkleTime = self->elapsedTime - sparkles[sparkleIndex].timeOffset;
		if (sparkleTime > 0.0 && sparkleTime < animationLength) {
			drawSprite(SPRITE_ID_SPARKLE, sparkleTime * ANIMATION_FRAME_RATE, false, Vector2f_add(screenPosition, sparkles[sparkleIndex].offset), COLOR4f(1.0f, 1.0f, 0.5f, 1.0f), vertexIO);
		}
	}
}
