#include "song_hash.h"

#define HASH_TABLE_SIZE 11

struct hash_elt *Table[HASH_TABLE_SIZE];

int hash_fn(int num);
void free_elt(struct hash_elt *elt);

int hash_fn(int num)
{
	return (num % HASH_TABLE_SIZE);
}

void insert_song(int track_num, char *title, char *filename)
{
	int hash_value;
	struct hash_elt *hash_list;
	struct hash_elt *new_elt;


	new_elt = (struct hash_elt *) malloc(sizeof(struct hash_elt));
	if (new_elt != NULL)
	{
		new_elt->track_num = track_num;
		new_elt->title = (char *)strdup(title);
		new_elt->filename = (char *)strdup(filename);
		new_elt->next = NULL;
	}

	hash_value = hash_fn(track_num);
	hash_list = Table[hash_value];
	if (hash_list != NULL) {
		while (hash_list->next != NULL) {
			hash_list = hash_list->next;
		}
		hash_list->next = new_elt;
	}
	else
	{
		Table[hash_value] = new_elt;
	}
}

struct hash_elt *get_song(int track_num)
{
	int hash_value;
	struct hash_elt *hash_list;

	hash_value = hash_fn(track_num);
	hash_list = Table[hash_value];
	if (hash_list) {
	    while ((hash_list->track_num != track_num) &&
		   (hash_list->next != NULL)) {
		hash_list = hash_list->next;
	    }
	    if (hash_list->track_num == track_num) {
		return hash_list;
	    }
	    else {
		return NULL;
	    }
	}
	else {
	    return NULL;
	}
}

void free_elt(struct hash_elt *elt)
{
	if (elt != NULL)
	{
		if (elt->next != NULL) {
			free_elt(elt->next);
		}
		free(elt);
	}
}

void empty_hash()
{
	int i;

	for (i = 0; i < HASH_TABLE_SIZE; i++) {
		free_elt(Table[i]);
		Table[i] = NULL;
	}
}

void print_hash()
{
	int i;
	struct hash_elt *hash_list;

	for (i = 0; i < HASH_TABLE_SIZE; i++) {
		printf("%d:\n", i);
		hash_list = Table[i];
		while (hash_list != NULL) {
			printf("\t%d: %s\n",
			       hash_list->track_num,
			       hash_list->title);
			hash_list = hash_list->next;
		}
	}

}