/**********************************************************
 * BiffSocko 
 * sortcsv.c
 *
 * takes the  comma delimmited csv file in arg1, and 
 * traverses through each line trying to sort the comma
 * delimited file in arg2, and creates a sorted comma 
 * delimited file (arg3)
 *
 * the files are being sorted by the first field
 * 
 * this is normally used for syncing the Group.csv to the
 * GroupSharedUserMap.csv or the Role.csv to the GroupRoleMap.csv
 *
 * USAGE:
 * sortcsv    <[ROLE|GROUP]>
 *
 * EXIT CODES:
 * 0 - Success
 * 1 - error 
 *
 * COMPILE INSTRUCTIONS:
 * gcc -o sortcsv sortcsv.c
 **********************************************************/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<strings.h>

#define MAX 1024
#define usage "[Group.csv|Role.csv] [GroupSharedUserMap.csv|GroupRoleMap.csv] [outputfile] [GROUP|ROLE]"

int main(int argc, char *argv[]){
	FILE *GRP = '\0';		/* File Descripter for group.csv */
	FILE *GRPSHR = '\0'; 		/* File Descripter for GroupSharedUserMap.csv */
	FILE *NEWGRPSHR	= '\0';		/* File Descripter for newGroupSharedUserMap */
	char GROUPSHAREFILE[MAX];	/* filename */
	char NEWGROUPSHARE[MAX];	/* filename */
	char GROUP[MAX];		/* filename */
	char matchstr[MAX];		/* String from group.csv to match */
	char lnstr[MAX]; 		/* String from GroupSharedUserMap.csv */
	char tmpstr[MAX]; 		/* temp String */
	char substr1[MAX];      	/* substring (groupname) */
	char substr2[MAX];      	/* substring (groupname) */
	char *seperator = ",";  	/* token for strtok */
	char *tokenptr; 		/* strtok pointer for string1 */
	char *tokenptr2; 		/* strtok pointer for string2 */
	char *prog=argv[0];		/* program name */
	char header[MAX];		/* holds role or group header */


	/*******************************************
	 * check command line args
	 *******************************************/
        if(argc != 5){
                fprintf(stderr, "usage: %s %s\n",prog, usage);
                /* get out till you learn how to use this */
                exit(1);
        }

	strcpy(GROUP, argv[1]);
	strcpy(GROUPSHAREFILE, argv[2]);
	strcpy(NEWGROUPSHARE, argv[3]);

	
	/*******************************************
	 * set up the role or group csv header 
	 *******************************************/
        if(strcasecmp(argv[4],"ROLE") == 0){
                strcpy(header, "Parent.UniqueName,UniqueName");
        }else{
        	if(strcasecmp(argv[4],"GROUP") == 0){
                        strcpy(header, "Parent.UniqueName,UniqueName,PasswordAdapter");
        	}else{
                	fprintf(stderr, "usage: %s %s\n",prog, usage);
                	/* get out till you learn how to use this */
                	exit(1);
        	}
	}

	/*******************************************
	 * open up all the files
	 *******************************************/
	if(!(GRP = fopen(GROUP,"r"))){
		printf("cant open %s to read\n",GROUP);
		exit(1);
	}
	
	if(!(NEWGRPSHR = fopen(NEWGROUPSHARE, "a"))){
		printf("cant open %s to write\n",NEWGROUPSHARE);
                fclose(GRP);
		fclose(GRPSHR);
                exit(1);
        }

	fprintf(NEWGRPSHR, "%s\n",header);
	fflush(NEWGRPSHR);

	/*******************************************
	 * traverse through Group.csv file
	 *******************************************/
	while(fgets(matchstr, MAX, GRP)){
		tokenptr = strtok(matchstr,seperator);	
		sprintf(substr1,"%s",tokenptr);

                /*******************************************
                 * traverse through the groupshareusermap.csv
                 * and compare substr1 from the Group.csv
                 * to substr2 from the groupshareusermap.csv
                 *******************************************/
		if(!(GRPSHR = fopen(GROUPSHAREFILE,"r"))){
                	printf("cant open %s to read\n",GROUPSHAREFILE);
                	fclose(GRP);
			fclose(NEWGRPSHR);
                	exit(1);
        	}

		/* skip first line (header) */
		fgets(lnstr, MAX, GRPSHR);
		while(fgets(lnstr, MAX, GRPSHR)){
			strcpy(tmpstr,lnstr);
                	tokenptr2 = strtok(tmpstr,seperator);
                	sprintf(substr2,"%s",tokenptr2);

			if(strcmp(substr2, substr1) == 0 ){
				fprintf(NEWGRPSHR, "%s", lnstr);
				fflush(NEWGRPSHR);
			}
		}

		/* reset everything */
		fclose(GRPSHR);
		substr1[0]=NULL;
		substr2[0]=NULL;
	}

	/* clean up and exit */
	close(GRP);
        close(NEWGRPSHR);
	exit(0);
}