#ifndef NULLSOFT_API_PLAYLISTMANAGER_H
#define NULLSOFT_API_PLAYLISTMANAGER_H

#include <bfc/dispatch.h>

class ifc_playlistloadercallback;
class ifc_playlist;
class ifc_playlistdirectorycallback;
enum
{
	PLAYLISTMANAGER_SUCCESS                 = 0,

	PLAYLISTMANAGER_FAILED                  = 1,
	PLAYLISTMANAGER_LOAD_NO_LOADER          = 1,
	PLAYLISTMANAGER_LOAD_LOADER_OPEN_FAILED = 2,
};

class api_playlistmanager : public Dispatchable
{
protected:
	api_playlistmanager()                                             {}
	~api_playlistmanager()                                            {}

public:
	int            Load( const wchar_t *filename, ifc_playlistloadercallback *playlist );
	int            LoadAs( const wchar_t *filename, const wchar_t *ext, ifc_playlistloadercallback *playlist ); // call with ext in the format ".pls"
	int            LoadFromDialog( const wchar_t *fns, ifc_playlistloadercallback *playlist );
	int            LoadFromANSIDialog( const char *fns, ifc_playlistloadercallback *playlist );
	
	int            Save( const wchar_t *filename, ifc_playlist *playlist );
	
	size_t         Copy( const wchar_t *destFn, const wchar_t *srcFn ); // returns number of items copied
	
	size_t         CountItems( const wchar_t *filename );
	
	int            GetLengthMilliseconds( const wchar_t *filename );
	uint64_t       GetLongLengthMilliseconds( const wchar_t *filename );
	
	void           Randomize( ifc_playlist *playlist );
	void           Reverse( ifc_playlist *playlist );
	
	void           LoadDirectory( const wchar_t *directory, ifc_playlistloadercallback *callback, ifc_playlistdirectorycallback *dirCallback );
	
	bool           CanLoad( const wchar_t *filename );
	
	void           GetExtensionList( wchar_t *extensionList, size_t extensionListCch );	
	void           GetFilterList( wchar_t *extensionList, size_t extensionListCch );

	const wchar_t *EnumExtension( size_t num );

public:
	DISPATCH_CODES
	{
	  API_PLAYLISTMANAGER_LOAD                   =  10,
	  API_PLAYLISTMANAGER_LOADNULLDELIMITED      =  11,
	  API_PLAYLISTMANAGER_LOADNULLDELIMITED_ANSI =  12,
	  API_PLAYLISTMANAGER_LOADAS                 =  13,
	  API_PLAYLISTMANAGER_SAVE                   =  20,
	  API_PLAYLISTMANAGER_COPY                   =  30,
	  API_PLAYLISTMANAGER_COUNT                  =  40,
	  API_PLAYLISTMANAGER_GETLENGTH              =  50,
	  API_PLAYLISTMANAGER_GETLONGLENGTH          =  51,
	  API_PLAYLISTMANAGER_LOADDIRECTORY          =  60,
	  API_PLAYLISTMANAGER_RANDOMIZE              = 100,
	  API_PLAYLISTMANAGER_REVERSE                = 110,
	  API_PLAYLISTMANAGER_CANLOAD                = 120,
	  API_PLAYLISTMANAGER_GETEXTENSIONLIST       = 130,
	  API_PLAYLISTMANAGER_GETFILTERLIST          = 140,
	  API_PLAYLISTMANAGER_ENUMEXTENSION          = 150,
	};
};

inline void api_playlistmanager::GetFilterList( wchar_t *extensionList, size_t extensionListCch )
{
	extensionList[ 0 ] = 0; // just in case no one implements it
	extensionList[ 1 ] = 0;

	_voidcall( API_PLAYLISTMANAGER_GETFILTERLIST, extensionList, extensionListCch );
}

inline int api_playlistmanager::LoadAs( const wchar_t *filename, const wchar_t *ext, ifc_playlistloadercallback *playlist )
{
	return _call( API_PLAYLISTMANAGER_LOADAS, (int)PLAYLISTMANAGER_FAILED, filename, ext, playlist );
}

inline void api_playlistmanager::GetExtensionList( wchar_t *extensionList, size_t extensionListCch )
{
	extensionList[ 0 ] = 0; // just in case no one implements it
	_voidcall( API_PLAYLISTMANAGER_GETEXTENSIONLIST, extensionList, extensionListCch );
}

inline int api_playlistmanager::Load( const wchar_t *filename, ifc_playlistloadercallback *playlist )
{
	return _call( API_PLAYLISTMANAGER_LOAD, (int)PLAYLISTMANAGER_FAILED, filename, playlist );
}

inline int api_playlistmanager::LoadFromDialog( const wchar_t *filename, ifc_playlistloadercallback *playlist )
{
	return _call( API_PLAYLISTMANAGER_LOADNULLDELIMITED, (int)PLAYLISTMANAGER_FAILED, filename, playlist );
}

inline int api_playlistmanager::LoadFromANSIDialog( const char *filename, ifc_playlistloadercallback *playlist )
{
	return _call( API_PLAYLISTMANAGER_LOADNULLDELIMITED_ANSI, (int)PLAYLISTMANAGER_FAILED, filename, playlist );
}

inline int api_playlistmanager::Save( const wchar_t *filename, ifc_playlist *playlist )
{
	return _call( API_PLAYLISTMANAGER_SAVE, (int)PLAYLISTMANAGER_FAILED, filename, playlist );
}

inline size_t api_playlistmanager::Copy( const wchar_t *destFn, const wchar_t *srcFn )
{
	return _call( API_PLAYLISTMANAGER_COPY, (size_t)0, destFn, srcFn );
}

inline size_t api_playlistmanager::CountItems( const wchar_t *filename )
{
	return _call( API_PLAYLISTMANAGER_COUNT, (size_t)0, filename );
}

inline int api_playlistmanager::GetLengthMilliseconds( const wchar_t *filename )
{
	return _call( API_PLAYLISTMANAGER_GETLENGTH, (int)0, filename );
}

inline uint64_t api_playlistmanager::GetLongLengthMilliseconds( const wchar_t *filename )
{
	return _call( API_PLAYLISTMANAGER_GETLONGLENGTH, (uint64_t)0, filename );
}

inline void api_playlistmanager::Randomize( ifc_playlist *playlist )
{
	_voidcall( API_PLAYLISTMANAGER_RANDOMIZE, playlist );
}

inline void api_playlistmanager::Reverse( ifc_playlist *playlist )
{
	_voidcall( API_PLAYLISTMANAGER_REVERSE, playlist );
}

inline void api_playlistmanager::LoadDirectory( const wchar_t *directory, ifc_playlistloadercallback *callback, ifc_playlistdirectorycallback *dirCallback )
{
	_voidcall( API_PLAYLISTMANAGER_LOADDIRECTORY, directory, callback, dirCallback );
}

inline bool api_playlistmanager::CanLoad( const wchar_t *filename )
{
	return _call( API_PLAYLISTMANAGER_CANLOAD, (bool)true, filename );
}

inline const wchar_t *api_playlistmanager::EnumExtension( size_t num )
{
	return _call( API_PLAYLISTMANAGER_ENUMEXTENSION, (const wchar_t *)0, num );
}

// {C5618774-7177-43aa-9906-933C9F40EBDC}
static const GUID api_playlistmanagerGUID =
{ 0xc5618774, 0x7177, 0x43aa, { 0x99, 0x6, 0x93, 0x3c, 0x9f, 0x40, 0xeb, 0xdc } };

#endif