#ifndef SNAPFILE_H
#define SNAPFILE_H

// Description
/*
SnapFile is a library based on SDL and SDL_gfx built to manage an index.

Author : Jovian Hersmeule
Last modification : 14 May 2017

> Why is it relevant to use index ?
Index are commonly used to list files inside a folder. Using index is
relevant because it doesn't rely on a specific exploitation system.
Indeed, listing files in a folder recquires specific libraries which
are different between Windows and Linux.

> What can perform SnapFile ?
SnapFile has many functions do update and read your index. Thanks to SDL, SnapFile
can create windows in order to interact easily with a user, in order to type a file
name or to choose a file from the index.
*/

// Basic includes
#include <iostream>
#include <vector>
#include <fstream>

// Graphic includes
#include <SDL/SDL.h>
#include <SDL/SDL_gfxPrimitives.h>

// Graphic config
struct SF_Graphic
{
	unsigned int h;
	unsigned int w;
	Uint32 color_line; // GFX : RGBA
	Uint32 color_back; // SDL : ARGB
	Uint32 color_select; // GFX : RGBA
	std::string name;
};

// Standard graphic config
#define SF_STDGRPH {300, 400, 0xffff00ff, 0xff000000, 0xffffffff, "SnapFile"}

// Add files listed in the index given
void SF_makeList( const std::string & indexName, std::vector<std::string> & dirList );

// Keep files with desired extension, and remove them if wanted
void SF_filter( std::vector<std::string> & dirList, std::string ext, bool autoRemove = false );

// Use a window and return file chosen
void SF_choose( const std::string & indexName, std::string & fileChosen, SDL_Surface* tgt = nullptr, const SF_Graphic cfg = SF_STDGRPH );

// Use a window to write a name
void SF_keyName( std::string & fileName, SDL_Surface* tgt = nullptr, const SF_Graphic cfg = SF_STDGRPH );

// Use a window to add a file, modify arg "fileName"
void SF_addAskedFile( const std::string & indexName, std::string & fileName, SDL_Surface* tgt = nullptr, const SF_Graphic cfg = SF_STDGRPH );

// Add a file in a index, with occurence check
void SF_addFile( const std::string & indexName, const std::string & fileName );

// Create a window if needed, return true if creation
bool SF_fixWindow( SDL_Surface* & tgt, const SF_Graphic cfg = SF_STDGRPH );

// Add shape and esthetic
void SF_enhanceWindow( SDL_Surface* screen, const SF_Graphic & cfg );

#endif