#include "loader.h"
#include "../compile.h"

#include "mesh_3ds.h"
#include "mesh_txt.h"
#include "texture_bmp.h"
#include "texture_png.h"
#include "texture_jpeg.h"
#include "texture_tiff.h"
#include <iostream>

namespace sleek
{
    namespace loader
    {
        loader::loader(std::shared_ptr<io::filesystem> f)
            : fs(f)
        {
            if(!fs)
            {
                std::cout << "no filesystem\n";
                return;
            }

            #ifdef mesh_loader_3ds_support
            mesh.push_back(new meshloader_3ds());
            #endif

            #ifdef mesh_loader_txt_support
            mesh.push_back(new meshloader_txt());
            #endif

            #ifdef texture_loader_bmp_support
            texture.push_back(new textureloader_bmp());
            #endif

            #ifdef texture_loader_png_support
            texture.push_back(new textureloader_png());
            #endif

            #ifdef texture_loader_jpeg_support
            texture.push_back(new textureloader_jpeg());
            #endif

            #ifdef texture_loader_tiff_support
            texture.push_back(new textureloader_tiff());
            #endif
        }
        loader::~loader()
        {
        }
        std::shared_ptr<driver::MeshBuffer> loader::loadMesh(const std::string &filename) const noexcept
        {
            if(!fs)
                return nullptr;

            for(auto e : mesh)
                if(e->match(filename))
                    return e->read(fs.get(), filename);

            return nullptr;
        }
        std::shared_ptr<driver::texture> loader::loadTexture(const std::string &filename) const noexcept
        {
            if(!fs)
                return nullptr;

            for(auto e : texture)
                if(e->match(filename))
                    return e->read(fs.get(), filename);

            return nullptr;
        }
        bool loader::writeMesh(std::shared_ptr<driver::MeshBuffer> data, const std::string &filename) const noexcept
        {
            if(!fs || !data)
                return false;

            for(auto e : mesh)
                if(e->match(filename))
                    return e->write(fs.get(), data.get(), filename);

            return false;
        }
        bool loader::writeTexture(std::shared_ptr<driver::texture> data, const std::string &filename) const noexcept
        {
            if(!fs || !data)
                return false;

            for(auto e : texture)
                if(e->match(filename))
                    return e->write(fs.get(), data.get(), filename);

            return false;
        }
    }
}