#include <taglib/fileref.h>

MODULE = Audio::Tagger		PACKAGE = Audio::Tagger::Any

SV *
_tagger_any_file_new(path)
	SV *path

	INIT:
		Tag *tag;
		FileRef *file;
		SV *self = newSV(1);

		const char *filename;
	CODE:
		filename = SvPV_nolen(path);

		file = new FileRef(filename);

		RETVAL = sv_setref_pv(self, "Audio::Tagger::Any", (void *) file);
	OUTPUT: RETVAL

SV *
_tagger_any_file_save(self)
	SV *self

	INIT:
		FileRef *file;

	CODE:
		if (sv_isobject(self) && sv_derived_from(self, "Audio::Tagger::Any"))
			file = INT2PTR(FileRef *, SvIV((SV *) SvRV(self)));
		else
			Perl_croak(aTHX_ "$var is not of type Audio::Tagger::Any");

		if (file -> save())
			RETVAL = newSVuv(1);
		else
			RETVAL = newSVuv(0);
	OUTPUT: RETVAL

void
_tagger_any_file_destroy(self)
	SV *self

	INIT:
		FileRef *file;
	CODE:
		if (sv_isobject(self) && sv_derived_from(self, "Audio::Tagger::Any"))
			file = INT2PTR(FileRef *, SvIV((SV *) SvRV(self)));
		else
			Perl_croak(aTHX_ "$var is not of type Audio::Tagger::Any");

		delete file;

SV *
_tagger_any_tag_get_str(self, tagn)
	SV *self
	unsigned int tagn;

	INIT:
		Tag *tag;
		String str;
		FileRef *file;
	CODE:
		if (sv_isobject(self) && sv_derived_from(self, "Audio::Tagger::Any"))
			file = INT2PTR(FileRef *, SvIV((SV *) SvRV(self)));
		else
			Perl_croak(aTHX_ "$var is not of type Audio::Tagger::Any");

		tag = file -> tag();

		switch (tagn) {
			case 0: { str = tag -> title();   break; }
			case 1: { str = tag -> artist();  break; }
			case 2: { str = tag -> album();   break; }
			case 3: { str = tag -> comment(); break; }
			case 4: { str = tag -> genre();   break; }
		}

		RETVAL = newSVpv(str.toCString(), 0);
	OUTPUT: RETVAL

SV *
_tagger_any_tag_set_str(self, tagn, string)
	SV *self
	SV *string
	unsigned int tagn

	INIT:
		Tag *tag;
		FileRef *file;

		const char *new_string;
	CODE:
		if (sv_isobject(self) && sv_derived_from(self, "Audio::Tagger::Any"))
			file = INT2PTR(FileRef *, SvIV((SV *) SvRV(self)));
		else
			Perl_croak(aTHX_ "$var is not of type Audio::Tagger::Any");

		new_string = SvPV_nolen(string);

		tag = file -> tag();

		switch (tagn) {
			case 0: { tag -> setTitle(new_string);   break; }
			case 1: { tag -> setArtist(new_string);  break; }
			case 2: { tag -> setAlbum(new_string);   break; }
			case 3: { tag -> setComment(new_string); break; }
			case 4: { tag -> setGenre(new_string);   break; }
		}

		RETVAL = newSVpv(new_string, 0);
	OUTPUT: RETVAL

SV *
_tagger_any_tag_get_num(self, tagn)
	SV *self
	unsigned int tagn;

	INIT:
		Tag *tag;
		FileRef *file;
		unsigned int num;
	CODE:
		if (sv_isobject(self) && sv_derived_from(self, "Audio::Tagger::Any"))
			file = INT2PTR(FileRef *, SvIV((SV *) SvRV(self)));
		else
			Perl_croak(aTHX_ "$var is not of type Audio::Tagger::Any");

		tag = file -> tag();

		switch (tagn) {
			case 0: { num = tag -> year();   break; }
			case 1: { num = tag -> track();  break; }
		}

		RETVAL = newSVuv(num);
	OUTPUT: RETVAL

SV *
_tagger_any_tag_set_num(self, tagn, number)
	SV *self
	unsigned int tagn
	unsigned int number

	INIT:
		Tag *tag;
		FileRef *file;
	CODE:
		if (sv_isobject(self) && sv_derived_from(self, "Audio::Tagger::Any"))
			file = INT2PTR(FileRef *, SvIV((SV *) SvRV(self)));
		else
			Perl_croak(aTHX_ "$var is not of type Audio::Tagger::Any");

		tag = file -> tag();

		switch (tagn) {
			case 0: { tag -> setYear(number);  break; }
			case 1: { tag -> setTrack(number); break; }
		}

		RETVAL = newSVuv(number);
	OUTPUT: RETVAL

SV *
_tagger_any_prop_get_num(self, propn)
	SV *self
	unsigned int propn;

	INIT:
		FileRef *file;
		unsigned int num;
		AudioProperties *prop;
	CODE:
		if (sv_isobject(self) && sv_derived_from(self, "Audio::Tagger::Any"))
			file = INT2PTR(FileRef *, SvIV((SV *) SvRV(self)));
		else
			Perl_croak(aTHX_ "$var is not of type Audio::Tagger::Any");

		prop = file -> audioProperties();

		switch (propn) {
			case 0: { num = prop -> bitrate();    break; }
			case 1: { num = prop -> sampleRate(); break; }
			case 2: { num = prop -> channels();   break; }
		}

		RETVAL = newSVuv(num);
	OUTPUT: RETVAL