#include "Playlist.h"
#include <stdio.h>
#include <iostream>

using namespace SoundSystem;

PlayList::PlayList(void)
{
	loop = false;
	random = false;
	index = 0;
	// unuseful clear but here for sanity check ;-) (mais pourquoi je parle en anglais ici moi ????)
	list.clear();
}

PlayList::~PlayList(void)
{
	clear();
}

string PlayList::next()
{
	int retIndex = 0;
	if (random)
	{
		retIndex = randomIndex[index];
	}
	else
	{
		retIndex = index;
	}
	if (!isFinish())
	{
		index++;
		if (isFinish())
		{
			if (loop)
			{
				start();
			}
		}
	}
	else
	{
		return "";
	}
	return list[retIndex];
}

void PlayList::setRandom(bool rand)
{
	random = rand;
	if (rand)
	{
		initRandom(index,list.size());
	}
}

bool PlayList::isRandom()
{
	return random;
}

void PlayList::setLooping(bool loop)
{
	this->loop = loop;
	if (isFinish())
	{
		if (loop)
		{
			start();
		}
	}
}

bool PlayList::isLooping()
{
	return loop;
}

int PlayList::size()
{
	return list.size();
}

bool PlayList::load(const string& filePath, bool append)
{
	bool ret = false;
	// on nettoie la liste precedente
	if (!append)
	{
		clear();
	}
	fstream fichier;
	fichier.open(filePath.c_str(),ios::in);
	if (fichier.is_open())
	{
		char buffer[512];
		fichier.getline(buffer,512);
		string ligne(buffer);
		if (ligne == "#define PLAYLIST")
		{
			while (!fichier.eof())
			{
				// on lit une ligne
				fichier.getline(buffer,512);
				if (buffer[0] != '#' && strlen(buffer)>0)
				{
					// on essai de l'ajouter
					add(buffer);
				}
			}
			ret = true;
		}
		else
		{
			fprintf(stderr,"fichier de playlist %s non valide, le fichier doit commencer par #define PLAYLIST\n",filePath.c_str());
		}
	}
	else
	{
		fprintf(stderr,"impossible d'ouvrire le fichier de playlist %s\n",filePath.c_str());
	}
	return ret;
}

void PlayList::clear()
{
	list.clear();
}

bool PlayList::add(const string& filePath)
{
	bool ret = false;
	// on test l'existance du fichier.
	fstream fichier;
	fichier.open(filePath.c_str(),ios::in);
	if (fichier.is_open())
	{
		list.push_back(filePath);
		// on ajout la chanson a la liste des random (apres l'index de lecture courant pour eviter de remetre
		// apres l'index courant une musique deja passée
		randomIndex.push_back(randomIndex.size());
		tirage(index,randomIndex.size() - 1,randomIndex.size() - 1);
		ret = true;
	}
	fichier.close();
	return ret;
}

bool PlayList::isFinish()
{
	return (index == size());
}

void PlayList::initRandom(int begin, int end)
{
	randomIndex.resize(list.size());
	// initialisation de la liste d'index
	for (int i = begin; i < end; i++)
	{
		randomIndex[i] = i;
	}
	// et maintenant on fout le bordel ;-)
	for (int i = end-1; i > begin ; i--)
	{
		tirage(0,i,i);
	}
}

void PlayList::tirage(int indexMin,int maxIndex, int workIndex)
{
	int i = 0;
	if ((maxIndex - indexMin) > 0)
	{
		i = (rand() % (maxIndex - indexMin)) + indexMin;
	}
	int tmp = randomIndex[workIndex];
	randomIndex[workIndex] = randomIndex[i];
	randomIndex[i] = tmp;
}

void PlayList::start()
{
	index = 0;
	initRandom(0,list.size());
}


