/********************\
|  Copyright 2024,   |
|       Ulysse Cura  |
\********************/

///////////////////////////////////////////////
//                                           //
//   Definition de la classe TextureManager. //
//                                           //
///////////////////////////////////////////////

#include <iostream>
#include <SDL2/SDL_image.h>
#include <stdexcept>
#include "Game.hpp"
#include "TextureManager.hpp"

using std::string, std::cerr, std::runtime_error;

SDL_Texture *TextureManager::LoadTexture(const string &path)
{
    auto it = m_textures.find(path);

    if (it != m_textures.end())
        return it->second.get();

    SDL_Surface *tmpSurface = IMG_Load(path.c_str());
    if (!tmpSurface) {
        cerr << "Erreur IMG_Load : " << IMG_GetError() << '\n';
        throw runtime_error("Impossible de charger la texture depuis la memoire.\n");
    }

    SDL_Texture *texture = SDL_CreateTextureFromSurface(Game::renderer, tmpSurface);
    SDL_FreeSurface(tmpSurface);

    if (!texture) {
        cerr << "Erreur SDL_CreateTextureFromSurface : " << SDL_GetError() << '\n';
        throw runtime_error("Impossible de convertir la surface en texture.\n");
    }

    m_textures.emplace(path, texture_ptr(texture, &SDL_DestroyTexture));

    it = m_textures.find(path);

    if(it != m_textures.end())
        return it->second.get();


    throw runtime_error("Impossible de trouver la texture dans l'unordered_map.\n");
}

void TextureManager::Draw(SDL_Texture *texture, SDL_Rect srcR, SDL_Rect dstR, bool flip)
{
    SDL_RendererFlip flipRender {SDL_FLIP_NONE};

    if(flip) flipRender = SDL_FLIP_HORIZONTAL;

    if(SDL_RenderCopyEx(Game::renderer, texture, &srcR, &dstR, 0, NULL, flipRender) != 0)
    {
        cerr << "Erreur SDL_RenderCopy : " << SDL_GetError() << '\n';
        throw runtime_error("Impossible de dessiner la texture.\n");
    }
}