#include "ecdb.h"

int transcode_data_cb(void *data, int type, void *event);
int ecdb_audio_project_init(Ecdb_Audio_Project *proj);

Ecdb_Audio_Project *
ecdb_audio_project_new(void)
{
	Ecdb_Audio_Project *proj;

	proj = calloc(1, sizeof(Ecdb_Audio_Project));
	if (!proj)
		return NULL;
	if (!ecdb_audio_project_init(proj))
	{
		FREE(proj);
		return NULL;
	}

	return proj;
}

int
ecdb_audio_project_init(Ecdb_Audio_Project *proj)
{
	if (!ecdb_project_init(ECDB_PROJECT(proj)))
		return FALSE;

	ecdb_project_type_set(ECDB_PROJECT(proj), ECDB_AUDIO_PROJECT);
	proj->tracks = ecdb_source_new();
	proj->num_tracks = 0;
	proj->num_transcode_complete = 0;

	return TRUE;
}

void
ecdb_audio_project_destroy(Ecdb_Audio_Project *proj)
{
	ecdb_source_destroy(proj->tracks);
	ecdb_project_destroy(ECDB_PROJECT(proj));
	free(proj);
}

void
ecdb_audio_project_start(Ecdb_Audio_Project *proj)
{
	char cmd[PATH_MAX]; //<-- + 20ish?
	int i;

	/* Fork off the gstreamer program for every file to be added
	 * Depending on the number of files, this can be pretty system intensive, so
	 * is there a way to reduce/control this ?
	 */
	for (i = 0; proj->tracks->children[i]; i++)
	{
		snprintf(cmd, PATH_MAX, "ecdb_transcode_helper %s",
				proj->tracks->children[i]->dst);
		ecore_exe_pipe_run(cmd, ECORE_EXE_PIPE_READ |
					ECORE_EXE_PIPE_READ_LINE_BUFFERED, NULL);
	}
	
	proj->num_tracks = i + 1;
	ecore_event_handler_add(ECORE_EXE_EVENT_DATA, transcode_data_cb, proj);
}

int
transcode_data_cb(void *data, int type, void *event)
{
	const char *rec;
	Ecore_Exe_Event_Data *ev = event;
	Ecdb_Audio_Project *proj = data;

	rec = ev->data;
	proj->num_transcode_complete++;

	printf("Message: %s\n", rec);

	if (!strcmp(rec, "EOS"))
	{
		printf("Transcode complete\n");
		proj->num_transcode_complete++;
	}

	/* How to handle errors? */
	else
		printf("Error!\n");

	if (proj->num_tracks == proj->num_transcode_complete)
	{
		printf("Hurrah, transcoding is done!\n");
		
		/* Change to another event later */
		ecore_event_add(ECORE_EVENT_SIGNAL_EXIT, NULL, NULL, NULL);
	}

	return 1;
}

