#include <allegro5/allegro.h>
#include <allegro5/allegro_image.h>
#include <map>
#include <string>
#include <vector>
#include <iostream>

using std::cout;
using std::map;
using std::string;
using std::pair;
using std::vector;

ALLEGRO_BITMAP* verbose_load(const char* filename)
{
	cout << "Loading: " << filename << std::endl;
	return al_load_bitmap(filename);
}

struct SResourceManager
{
	ALLEGRO_BITMAP* Load(string filename)
	{
		BitmapsIt it = Bitmaps.find(filename);
		if(it == Bitmaps.end())
		{
			ALLEGRO_BITMAP* bmp = verbose_load(filename.c_str());
			if(!bmp)
				cout << "Couldn't load: " << filename << std::endl;
			assert(bmp);
			Bitmaps.insert(pair<string, ALLEGRO_BITMAP*>(filename, bmp));
			return bmp;
		}
		else
		{
			return it->second;
		}
	}

private:
	typedef map<string, ALLEGRO_BITMAP*>::iterator BitmapsIt;
	map<string, ALLEGRO_BITMAP*> Bitmaps;
};

struct SObject
{
	SObject(SResourceManager& manager, string name, ALLEGRO_CONFIG* config)
	{
		const char* bitmap_name = al_get_config_value(config, name.c_str(), "bitmap");
		assert(bitmap_name);
		Bitmap = manager.Load(bitmap_name);
		cout << "Created object: " << name << std::endl;
	}
private:
	ALLEGRO_BITMAP* Bitmap;
};

int main()
{
	al_init();
	al_init_image_addon();
	
	SResourceManager manager;
	vector<SObject*> objects;
	
	ALLEGRO_CONFIG* objects_config = al_load_config_file("objects.ini");
	assert(objects_config);
	
	ALLEGRO_CONFIG_SECTION* it;
	const char* section = al_get_first_config_section(objects_config, &it);
	
	while(section != NULL)
	{
		string section_name(section);
		if(section_name != "")
		{
			objects.push_back(new SObject(manager, section_name, objects_config));
		}
		
		section = al_get_next_config_section(&it);
	}
	
	al_destroy_config(objects_config);
	
	return 0;
}
