#include "engine/animation.h"

void animation_set(Animation *a, const AnimDef *def) {
    if (a->def == def) return; /* don't restart same anim */
    a->def = def;
    a->current_frame = 0;
    a->timer = 0.0f;
    a->finished = false;
}

void animation_update(Animation *a, float dt) {
    if (!a->def || a->finished) return;

    a->timer += dt;
    while (a->timer >= a->def->frames[a->current_frame].duration) {
        float dur = a->def->frames[a->current_frame].duration;
        if (dur <= 0.0f) break;  /* avoid infinite loop on zero-duration frames */
        a->timer -= dur;
        a->current_frame++;

        if (a->current_frame >= a->def->frame_count) {
            if (a->def->looping) {
                a->current_frame = 0;
            } else {
                a->current_frame = a->def->frame_count - 1;
                a->finished = true;
                a->timer = 0.0f;
                return;
            }
        }
    }
}

SDL_Rect animation_current_rect(const Animation *a) {
    if (!a->def || a->def->frame_count == 0) {
        return (SDL_Rect){0, 0, 0, 0};
    }
    return a->def->frames[a->current_frame].src;
}

bool animation_is_last_frame(const Animation *a) {
    if (!a->def) return true;
    return a->current_frame >= a->def->frame_count - 1;
}

SDL_Texture *animation_texture(const Animation *a) {
    if (!a->def) return NULL;
    return a->def->texture;
}
