#include <stdlib.h>
#include <stdio.h>
#include <stdint.h>
#include <string.h>
//
//  of population
//  of eligible voters
//  of registered voters
//
//  
//

struct State_Data{
	char state_n[16];
	uint32_t population;
	uint32_t eligible;
	uint32_t registered;
	uint32_t electors;
}state_data[51];


void Usage(void){
	printf("./parse input\n");
}


int main(int argc, char **argv){
	uint32_t n1 = 0;
	uint32_t n2 = 0;
	uint32_t n3 = 0;
	uint32_t t_population = 0;
	uint32_t t_eligible = 0;
	uint32_t t_registered = 0;
	uint32_t t_electors = 0;
	const uint32_t number_of_states = 51;
	const uint32_t read_buffer_size = 64;

	double tmp_value = 0;
	double vote_value = 0;
	double population_value = 0;
	double eligible_value = 0;
	double registered_value = 0;
	double electors_value = 0;

	char read_buffer[64];
	char tmp_buffer[16];
	size_t s1 = 0;
	FILE *fdata_in = NULL;
	char *ndata_in = NULL;

	if(argc != 2){
		Usage();
		exit(1);
	}

	s1 = strlen(argv[1])+1;
	ndata_in = malloc(s1);
	ndata_in = strcpy(ndata_in, (const char *)argv[1]);

//printf("h1\n");

	fdata_in = fopen( ndata_in, "r" );
	if(fdata_in == NULL){
		printf("Error Opening %s Exiting\n", ndata_in);
		free(ndata_in);
		exit(1);
	}
//printf("h2\n");
	(void)memset( (void *)read_buffer, '\0', read_buffer_size);

	while( fgets(read_buffer, read_buffer_size, fdata_in) != NULL){
//printf("h3\n");
		//state name
		(void)memset( (void *)state_data[n1].state_n, '\0', 16);
		n2 = 0;
		while(read_buffer[n2] != ':'){
			state_data[n1].state_n[n2] = read_buffer[n2];
			n2++;
		}
//printf("h4\n");
		//state_data[n1].state_n[n2] = '\0';
		//population
		n2++;
		(void)memset( (void *)tmp_buffer, '\0', 16);
		for(n3=0; read_buffer[n2] != ':'; n3++){
			tmp_buffer[n3] = read_buffer[n2];
			n2++;
		}
		state_data[n1].population = atoi(tmp_buffer);
		n2++;
		//eligible
		(void)memset( (void *)tmp_buffer, '\0', 16);
		for(n3=0; read_buffer[n2] != ':'; n3++){
			tmp_buffer[n3] = read_buffer[n2];
			n2++;
		}
		state_data[n1].eligible = atoi(tmp_buffer);
		n2++;
		//registered
		(void)memset( (void *)tmp_buffer, '\0', 16);
		for(n3=0; read_buffer[n2] != ':'; n3++){
			tmp_buffer[n3] = read_buffer[n2];
			n2++;
		}
		state_data[n1].registered = atoi(tmp_buffer);
		n2++;
		//electors
		(void)memset( (void *)tmp_buffer, '\0', 16);
		for(n3=0; read_buffer[n2] != '\0'; n3++){
			tmp_buffer[n3] = read_buffer[n2];
			n2++;
		}
		state_data[n1].electors = atoi(tmp_buffer);
		//n2++;
		n1++;
	}

	//stat:population:eligible:registered:electors
	free(ndata_in);
	fclose(fdata_in);

	//generate stats now
	for(n1=0; n1<number_of_states; n1++){
		printf("%d: %s %d %d %d %d\n", n1+1, state_data[n1].state_n, state_data[n1].population, state_data[n1].eligible, state_data[n1].registered, state_data[n1].electors);

		t_population += state_data[n1].population;
		t_eligible += state_data[n1].eligible;
		t_registered += state_data[n1].registered;
		t_electors += state_data[n1].electors;

	}
	printf("Total: %d %d %d %d\n", t_population, t_eligible, t_registered, t_electors);

	printf("num\tstate\t\tpopulation\teligible\tregistered\telectors\n");
	for(n1=0; n1<number_of_states; n1++){
		if(strlen(state_data[n1].state_n)<8){
			printf("%d:\t%s\t\t", n1+1, state_data[n1].state_n);
		}else{
			printf("%d:\t%s\t", n1+1, state_data[n1].state_n);
		}
		electors_value = (double)state_data[n1].electors/t_electors;
		population_value = (double)state_data[n1].population/t_population;
		vote_value = electors_value / population_value;
		printf("%.02lf\t\t", vote_value);
		eligible_value = (double)state_data[n1].eligible/t_eligible;
		vote_value = electors_value / eligible_value;
		printf("%.02lf\t\t", vote_value);
		registered_value = (double)state_data[n1].registered/t_registered;
		vote_value = electors_value / registered_value;
		printf("%.02lf\t\t", vote_value);
		printf("%.02lf%%\n", electors_value*100);
	}
	return 0;
}