#include <stdio.h>
#include<stdlib.h>
#include<string.h>
#include<strings.h>
#include<unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h> 
#include "toxml.h" 	
void sendXML(int sockfd,char *msg){
	char cmd[4];
	char key[257];
	char value[256*1024+1];
	char encodedXML[300000];
	char msgtype[10];
	char delim[2]="\n";
	strcpy(key,"");
	strcpy(value,"");
	for(int i =0;i<3;i++){
		cmd[i]=msg[i];
	}
	cmd[3]='\0';
	if(!strcmp(cmd,"GET")){
		strcpy(msgtype,"getreq");
		strcat(key,msg+4);
		key[strlen(key)-1]='\0';
		//printf("%s",key);
	}
	else if(!strcmp(cmd,"PUT")){
		strcpy(msgtype,"putreq");
		char a[2];
		for(int i=4;i<strlen(msg);i++){	
			if(msg[i]==' '){
				strcat(value,msg+i+1);
				break;
			}
			else{
				a[0]=msg[i];
				a[1]='\0';
				strcat(key,a);
			}		
		
		}
		
		value[strlen(value)-1]='\0';
		//printf("%s**%s",key,value);
		
		
	}
	else if(!strcmp(cmd,"DEL")){
		strcpy(msgtype,"delreq");
		strcat(key,msg+4);
		key[strlen(key)-1]='\0';
		//printf("%s",key);
	}
	else{
		printf("ERROR: Unknown operation.\n");
		return;
	}
	if(strlen(key)>256){
		printf("ERROR: Key cannot exceed 256B");
		return;
	}
	if(strlen(key)==0){
		printf("ERROR: Key cannot be NULL");
		return;
	}
	if(!strcmp(cmd,"PUT") && strlen(value)==0){
		printf("ERROR: Value cannot be NULL");
		return;
	}
	
	if(!strcmp(cmd,"PUT") && strlen(value)>(256*1024)){
		printf("ERROR: Value cannot exceed 256KB");
		return;
	}
	
	
	
	toXML(encodedXML,key,value,msgtype,"");
	
	write(sockfd,strcat(encodedXML,delim),strlen(encodedXML));
	char buf[256];
	read(sockfd,buf,256);
	
	
	
	return;
	
}
void error(char *msg)
{
    perror(msg);
    exit(0);
}

int main(int argc, char *argv[])
{
    int sockfd, portno, n,no_of_requests=0;

    struct sockaddr_in serv_addr;
    struct hostent *server;

    char buffer[256];

    portno = atoi("8080");
    sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if (sockfd < 0) 
        error("ERROR opening socket");
    server = gethostbyname("127.0.0.1");
    if (server == NULL) {
        fprintf(stderr,"ERROR, no such host\n");
        exit(0);
    }
    bzero((char *) &serv_addr, sizeof(serv_addr));
    serv_addr.sin_family = AF_INET;
    bcopy((char *)server->h_addr, 
         (char *)&serv_addr.sin_addr.s_addr,
         server->h_length);
    serv_addr.sin_port = htons(portno);
    if (connect(sockfd,(struct sockaddr *)&serv_addr,sizeof(serv_addr)) < 0) 
        error("ERROR connecting");
    
	FILE *fp;
	char* line=NULL;
	size_t len=0;
	fp=fopen("client_req.txt","r");
	if(fp==NULL){
		exit(1);
	}
	while((getline(&line,&len,fp))!=-1){
		//write(sockfd,line,read);
		no_of_requests++;
		sendXML(sockfd,line);
		sleep(1);
	}
	
	fclose(fp);
	
	while(1);
	
	//exit(0);

    return 0;
}