#include "../utils.h"
#include "../factory_objects.h"
#include "../resources.h"
#include "../camera.h"

typedef struct actor_ground_particle_s
{
    object_t *self_object;
    sprite_t *sprite;
    vector_t  position;
    vector_t  velocity;
    int       max_life;
    int       current_life;
} actor_ground_particle_t;

static void _Actor_GroundParticle_GetInfo(actor_ground_particle_t *actor, object_info_t *info)
{
    if (actor == NULL)
        return;

    if (info == NULL)
        return;

    info->box_rect       = Utils_GetRect(0, 0, 0, 0);
    info->collision_rect = Utils_GetRect(0, 0, 0, 0);
    info->position       = actor->position;

    if (actor->sprite != NULL)
    {
        info->box_rect.x = actor->position.x - actor->sprite->origin.x;
        info->box_rect.y = actor->position.y - actor->sprite->origin.y;
        info->box_rect.w = actor->sprite->width;
        info->box_rect.h = actor->sprite->height;

        info->collision_rect.x = actor->position.x - (actor->sprite->width / 2);
        info->collision_rect.y = actor->position.y - (actor->sprite->height / 2);
        info->collision_rect.w = actor->sprite->width;
        info->collision_rect.h = actor->sprite->height;
    }

    info->collision_cell_ul = Utils_GetPoint(0, 0);
    info->collision_cell_br = Utils_GetPoint(0, 0);
}

static void _Actor_GroundParticle_Update(actor_ground_particle_t *actor, float dt)
{
    if (actor == NULL)
        return;

    actor->velocity.y += 0.2f;
    actor->position.x += actor->velocity.x;
    actor->position.y += actor->velocity.y;

    actor->current_life++;

    if (actor->current_life > actor->max_life)
        FactoryObjects_SignRemove(actor->self_object);

    Sprite_Update(actor->sprite);
}

static void _Actor_GroundParticle_Draw(SDL_Renderer *renderer, actor_ground_particle_t *actor)
{
    if (actor == NULL)
        return;

    if (actor->sprite != NULL)
        Sprite_Draw(renderer, actor->sprite, actor->position);
}

static void _Actor_GroundParticle_Free(actor_ground_particle_t *actor)
{
    if (actor == NULL)
        return;

    Sprite_Free(actor->sprite);

    free(actor);

    actor = NULL;
}

void Actor_GroundParticle_Create(object_t *object, float x, float y, int max_life)
{
    if (object != NULL)
    {
        actor_ground_particle_t *actor = (actor_ground_particle_t*)malloc(sizeof(actor_ground_particle_t));

        actor->self_object = object;

        FactoryObjects_SetActor(object, (void*) actor, AT_GROUND_PARTICLE, OLAY_EFFECTS);

        FactoryObjects_SetFunc(object, _Actor_GroundParticle_GetInfo, OFUNC_GETINFO);
        FactoryObjects_SetFunc(object, _Actor_GroundParticle_Update,  OFUNC_UPDATE);
        FactoryObjects_SetFunc(object, _Actor_GroundParticle_Draw,    OFUNC_DRAW);
        FactoryObjects_SetFunc(object, _Actor_GroundParticle_Free,    OFUNC_FREE);

        int   dir = Utils_GetRandomRange(0, 10);
        float rx  = (float)Utils_GetRandomRange(0, 30) / 100;
        float ry  = (float)Utils_GetRandomRange(10, 30) / 10;

        if (dir < 5)
            rx = -rx;

        actor->sprite       = Sprite_Create(Utils_GetPoint(0, 0), 3, 3, ground_particleTex);
        actor->position     = Utils_GetVector(x, y);
        actor->velocity     = Utils_GetVector(rx, -ry);
        actor->max_life     = max_life;
        actor->current_life = 0;
    }
}
