#include "metadata_server.h"


metadata_server::metadata_server() {
	assert(pthread_mutex_init(&metadata_lock, NULL) == 0);
	assert(pthread_mutex_init(&count_lock, NULL) == 0);
	rpc_count = 0;
	printf("\nMetadata Server\n");
	printf("===============\n");
	
}

lock_protocol::status metadata_server::join(member m, std::list<member> & lst) {
	

	assert(pthread_mutex_lock(&count_lock) == 0);
	rpc_count++;
	if (rpc_count % PRINT_GRANULARITY == 0) {
		printf("RPCS %d \n", rpc_count);
	}
	assert(pthread_mutex_unlock(&count_lock) == 0);


	assert(pthread_mutex_lock(&metadata_lock) == 0);
	printf("Joined Client %d \n", m.get_client_id());
	mems.push_back(m);
	lst = mems;
	assert(pthread_mutex_unlock(&metadata_lock) == 0);
	
	return lock_protocol::OK;
}

lock_protocol::status metadata_server::leave(member m, int &) {
	assert(pthread_mutex_lock(&count_lock) == 0);
	rpc_count++;
	if (rpc_count % PRINT_GRANULARITY == 0) {
		printf("RPCS %d \n", rpc_count);
	}
	assert(pthread_mutex_unlock(&count_lock) == 0);


	assert(pthread_mutex_lock(&metadata_lock) == 0);
	
	std::list<member>::iterator it = mems.begin();
	while (it != mems.end()) {
		
		if (it->equals(m)) {
			it = mems.erase(it);
		} else {
			it++;
		}
	}
	
	assert(pthread_mutex_unlock(&metadata_lock) == 0);

	return lock_protocol::OK;
}

lock_protocol::status metadata_server::update(int, std::list<member> & lst) {
	assert(pthread_mutex_lock(&count_lock) == 0);
	rpc_count++;
	if (rpc_count % PRINT_GRANULARITY == 0) {
		printf("RPCS %d \n", rpc_count);
	}
	assert(pthread_mutex_unlock(&count_lock) == 0);


	assert(pthread_mutex_lock(&metadata_lock) == 0);
	lst = mems;
	assert(pthread_mutex_unlock(&metadata_lock) == 0);

	return lock_protocol::OK;
}

metadata_protocol::status metadata_server::stats(int, int &) {
	int r;

	printf("\nTotal RPC-s received: %d \n\n", rpc_count);
	std::list<member>::iterator it;
	for (it = mems.begin(); it != mems.end() ; it++) {
		member current = *it;
		int ret = cl.call(current.get_addr(), metadata_protocol::nr_locks,0, r, rpcc::to(1000));
		if (ret != -1) {
			printf("Client %d has %d locks. \n", current.get_client_id(), r);
		}
	}

	printf("\n\n");
	return metadata_protocol::OK;
}

