// src/game/collision.h
#pragma once
#include "../render/player_positioning.h"
#include "../assets/character_walk_frames.h"
#include "../assets/character_run_frames.h"
#include "../assets/character_crawl_frames.h"

// Obstacle representation
struct Obstacle {
    int x;
    int y;
    int width;
    int height;
};

// Axis-aligned bounding-box collision
inline bool check_collision(const CharacterPosition& player,
                            MovementType movement,
                            const Obstacle& obs) {

    // Player is given in bottom-based world coordinates (0 = bottom line)
    const int player_x = player.x;
    const int player_bottom = player.y;
    int box_x = 0;
    int box_w = 0;
    int box_h = 0;

    switch (movement) {
    case MovementType::Walk:
        box_x = player_x + CHARACTER_WALK_COLLISION_LEFT_OFFSET;
        box_w = CHARACTER_WALK_COLLISION_WIDTH;
        box_h = CHARACTER_WALK_FRAME_HEIGHT;
        break;
    case MovementType::Run:
        box_x = player_x + CHARACTER_RUN_COLLISION_LEFT_OFFSET;
        box_w = CHARACTER_RUN_COLLISION_WIDTH;
        box_h = CHARACTER_RUN_COLLISION_HEIGHT;
        break;
    case MovementType::Crawl1:
        box_x = player_x + CHARACTER_CRAWL1_COLLISION_LEFT_OFFSET;
        box_w = CHARACTER_CRAWL1_COLLISION_WIDTH;
        box_h = CHARACTER_CRAWL1_COLLISION_HEIGHT;
        break;
    case MovementType::Crawl2:
        box_x = player_x + CHARACTER_CRAWL2_COLLISION_LEFT_OFFSET;
        box_w = CHARACTER_CRAWL2_COLLISION_WIDTH;
        box_h = CHARACTER_CRAWL2_COLLISION_HEIGHT;
        break;
    }

    // Player bounding box
    const int player_left = box_x;
    const int player_right = player_left + box_w;
    const int player_top = player_bottom + box_h;

    // Obstacle bounding box
    const int obs_left = obs.x;
    const int obs_right = obs.x + obs.width;
    const int obs_bottom = obs.y;
    const int obs_top = obs_bottom + obs.height;

    // Overlap check
    bool horizontal = player_left < obs_right && player_right > obs_left;
    bool vertical = player_bottom < obs_top && player_top > obs_bottom;
    return horizontal && vertical;
}
