/*
 * group.c
 *
 * A group entity
 *
 *  Created on: Nov 28, 2010
 *      Author: blackpanther
 */
#include <string.h>

#include "configuration.h"

#include "persistentItem.h"
#include "group.h"

#include "utilities.h"
#include "logger.h"

#define GROUP_TEMPLATE "Group (id:%3u) : \n\t- name        : %s\n\t- responsable : %3u\n%s%s"

static
void addUserToGroup(Group * g, int userid)
{
	if(g->_users.size < MAX_ITEM)
	{
		g->_users.ids[ g->_users.size++ ] = userid;
	}
	else
	{
		logMessage(SEVERE,"method : add user to group","maximum reached, can't add more users");
	}
}

static
void addProblemToGroup(Group * g, int problemid)
{
	if(g->_users.size < MAX_ITEM)
	{
		g->_problems.ids[ g->_problems.size++ ] = problemid;
	}
	else
	{
		logMessage(SEVERE,"method : add problem to group","maximum reached, can't add more problems");
	}
}

static
void setDatabaseId(Group* group, unsigned int id)
{
	if( !group->_db_item )
		group->_db_item = createPersistentItem(id);
	else
		group->_db_item->_db_id = id;
}

static
unsigned int getDatabaseId(Group* group)
{
	if( group->_db_item )
		return group->_db_item->getId(group->_db_item);
	else
		return 0;
}

static
char* displayGroup(Group* group)
{
	int i;
	static char output[MAX_STRING_INPUT];
	char usersBuffer[MAX_STRING_INPUT];
	char problemsBuffer[MAX_STRING_INPUT];

	memset(output,0,MAX_STRING_INPUT*sizeof(char));

	sprintf(usersBuffer,"%s"," Users : \n");
	for(i=0;i<group->_users.size;i++)
	{
		sprintf(usersBuffer,"%s\t- %3d\n",usersBuffer,group->_users.ids[i]);
	}

	sprintf(problemsBuffer,"%s"," Problems : \n");
	for(i=0;i<group->_problems.size;i++)
	{
		sprintf(problemsBuffer,"%s\t- %3d\n",problemsBuffer,group->_problems.ids[i]);
	}

	sprintf(output,GROUP_TEMPLATE,
			group->getId(group),
			group->_name,
			group->_respo,
			usersBuffer,
			problemsBuffer);

	return output;
}

Group* createGroupSkeleton()
{
	Group* g = NULL;

	g = (Group *)malloc(sizeof(Group));

		handleError(
				!g,
				NULL,
				"method : createGroupSkeleton",
				"unable to malloc");

	g->_db_item = createPersistentItem(0);
	memset(g->_name,0,MAX_STRING_INPUT * sizeof(char));
	g->_respo = -1;

	memset(g->_problems.ids,0,MAX_ITEM * sizeof(int));
	g->_problems.size = 0;

	memset(g->_users.ids,0,MAX_ITEM * sizeof(int));
	g->_users.size = 0;

	g->addUser    = addUserToGroup;
	g->addProblem = addProblemToGroup;
    g->setId       = setDatabaseId;
    g->getId       = getDatabaseId;
    g->display     = displayGroup;

	return g;
}

void destroyGroup(Group* group)
{
	destroyPersistentItem(group->_db_item);
	free(group);
}
