/**
 * @author Bastiaan Welmers <haasje@welmers.net>
 *
 *
 */

// for mysql functionality
#include <my_global.h>
#include <my_sys.h>
#include <mysql.h>

// for printf()
#include <stdlib.h>

// str_replace
#include <str_replace.h>

// for strstr()
#include <string.h>

// for symlink()
#include <unistd.h>

// for basename
#include <libgen.h>

// database access information for amarok
#define USERNAME "amarok"
#define PASSWORD "korama"
#define DBNAME "amarok";
#define PORT 0
#define HOSTNAME NULL
#define SOCKET "/var/lib/mysql2/mysql.sock"
#define OPTIONFLAGS 0;

// query

#define QUERY  "SELECT \
CONCAT(devices.lastmountpoint, '/', t.url) AS filename, \
artist.name AS artist, \
album.name AS album, \
t.title AS title, \
t.track AS track \
FROM tags t \
LEFT JOIN devices ON devices.id = t.deviceid \
LEFT JOIN album ON album.id = t.album \
LEFT JOIN artist ON artist.id = t.artist \
ORDER BY t.bitrate DESC \
"

//$sql .= 'CONCAT(devices.lastmountpoint, \'/\', t.url) AS filename, ';
//$sql .= 'LEFT JOIN devices ON devices.id = t.deviceid ';


static MYSQL* conn;

typedef struct
{
	bool value;
	char* message;
} MK_Exception;

MK_Exception initMysql(const char*);

void closeMysql();

void process_resultset(MYSQL*, MYSQL_RES*);


int main(int argc, char** argv)
{
	MK_Exception retValue;
	if (!(retValue = initMysql(*argv)).value)
	{
		fprintf(stderr, "Error while initializing MySQL: %s\n", retValue.message);
		return 1;
	}
	
	char* query = QUERY; //"SELECT * FROM devices";
	
	
	
	MYSQL_RES* result;
	if (mysql_query(conn, query))
	{
		fprintf(stderr, "mysql_query failed: %s", query);
	} else {
		result = mysql_store_result(conn);
		process_resultset(conn, result);
	}
	
	closeMysql();
	return 0;
	
}

void closeMysql()
{
	mysql_close(conn);
	mysql_library_end();
}

MK_Exception initMysql(const char* programName)
{
	MK_Exception returnValue = {TRUE, NULL};
	
	static char* opt_host_name = HOSTNAME;
	static char* opt_user_name = USERNAME;
	static char* opt_password = PASSWORD;
	static unsigned int opt_port_num = PORT;
	static char* opt_socket_name = SOCKET;
	static char* opt_db_name = DBNAME;
	static unsigned int opt_flags = OPTIONFLAGS;
	
	MY_INIT(programName);
	
	if (mysql_library_init(0, NULL, NULL))
	{
		returnValue.value = FALSE;
		returnValue.message = "mysql_library_init() failed";
		return (returnValue);
	}
	conn = mysql_init(NULL);
	if (conn == NULL)
	{
		returnValue.value = FALSE;
		returnValue.message = "mysql_init() failed (out of memory?";
		return (returnValue);
	}
	
	if (mysql_real_connect(conn, opt_host_name, opt_user_name, opt_password, opt_db_name, opt_port_num, opt_socket_name, opt_flags) == NULL)
	{
		returnValue.value = FALSE;
		returnValue.message = "mysql_real_connect() failed?";
		return (returnValue);
	}
	
	//set proper encoding info
	
	if (mysql_query(conn, "SET NAMES 'utf8'"))
	{
		returnValue.value = FALSE;
		returnValue.message = "SET NAMES 'utf8' failed";
		return (returnValue);
	}
	if (mysql_query(conn, "SET CHARACTER SET utf8"))
	{
		returnValue.value = FALSE;
		returnValue.message = "SET CHARACTER SET utf8 failed";
		return (returnValue);
	}
	
	return returnValue;
	
}

void process_resultset(MYSQL* conn, MYSQL_RES* result)
{
	if (result == NULL)
	{
		fprintf(stderr, "mysql_store_result failed");
	} else {
		MYSQL_ROW row;
		unsigned int i;
		unsigned int num_fields = mysql_num_fields(result);
		
		//room for storing manupilated strings
		
		char filename_buffer[1024];
		char artist_buffer[256];
		char album_buffer[256];
		char title_buffer[256];
		char track_buffer[256];
		
		char dst_buffer[2048];

		char* filename = &filename_buffer[0];
		char* artist   = &artist_buffer[0];
		char* album    = &album_buffer[0];
		char* title    = &title_buffer[0];
		char* track    = &track_buffer[0];
		char* dst      = &dst_buffer[0];

		
		printf("Filenames:\n");
		printf("%i\n", num_fields);
		while ((row = mysql_fetch_row(result)) != NULL)
		{
			if (row[0] != NULL)
			{
				if (row[0])
					str_replace_buf(filename, "/./", "/", row[0]);
				else
					strcpy(filename, "");
				
				if (row[1])
					ucwords(strtolower(str_replace_buf(artist, "/", "-", row[1])));
				else
					strcpy(artist, "");
				
				if (row[2])
					ucwords(strtolower(str_replace_buf(album, "/", "-", row[2])));
				else
					strcpy(album, "");
				
				if (row[3])
					ucwords(strtolower(str_replace_buf(title, "/", "-", row[3])));
				else
					strcpy(title, "");
				
				if (row[4])
					strcpy(track, row[4]);
				else
					strcpy(track, "");
				
				// transform "1" till "9" to "01" till "09"
				if (strlen(track) == 1 && *track <= '9')
				{
					char track_temp = *track;
					strcpy(track, "00");
					track[1] = track_temp;
				}
				
				*dst = 0; // empty string
				if (strlen(artist) > 0)
				{
					strcat(dst, artist);
					strcat(dst, "/");
				}
				
				
				if (strlen(artist) > 0)
				{
					strcat(dst, artist);
					strcat(dst, "/");
				}
				
				if (strlen(album) > 0)
				{
					strcat(dst, album);
					strcat(dst, "/");
				}
				
				if (strlen(track) > 0)
				{
					strcat(dst, track);
					strcat(dst, " - ");
				}
				
				if (strlen(title) == 0)
				{
					strcpy(title, filename);
					basename(title);
					ucwords(title);
				}
				
				strcat(dst, title);
				
				char* suffix = filename + strlen(filename) - 3;
				
				strcat(dst, ".");
				strcat(dst, suffix);
				
				
				printf("%s\n", dst);
				
			}
		}
		if (mysql_errno(conn) != 0)
		{
		
			fprintf(stderr, "mysql_fetch_row() failed\n");
		} else {
			printf("Rows processed: %lu\n", (unsigned long) mysql_num_rows(result));
		}
	}
}

