//ClienSO 

#include <config.h>
#include <mem_compartida.h>
#include <semaforos.h>
#include <sys/ipc.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>

#define ERROR 	-1

void error() 
{
	printf("Error: comando invalido\n");
	exit(0);
}

int main(int argv,char **argc) 
{
	int i;
	int mem_id,sem_id;
	struct memoria_compartida *mem;
	int oper;
	char clave[MAX_CLAVE];
	char ruta[MAX_RUTA];
	char desc[MAX_DESC];
	int tiempo;

		mem_id = obtenerMemoria();
		sem_id = obtenerSemaforos();
		mem = (struct memoria_compartida *) ptrMemoria(mem_id);

		if (sem_id == ERROR || mem_id == ERROR) {
			printf("ClienSO: El servidor no esta corriendo\n");
			exit(1);
		}
		

		if (argv < 3) 
			error();
		
		if (strcmp(argc[1],"creproc")==0 && argv >= 4) {
			oper=OP_CREAR_PROCESO;
			strcpy(clave,argc[2]);
			strcpy(ruta,argc[3]);
			strcpy(desc,"\0");
			for (i = 4;i<argv;i++) {
				strcat(desc,argc[i]);
				strcat(desc," ");
			}
	
		} 
		else if (strcmp(argc[1],"eliproc")==0 && argv == 3) {
			oper=OP_ELIMINAR_PROCESO;
			strcpy(clave,argc[2]);
	
		} 
		else if (strcmp(argc[1],"iniproc")==0 && argv == 3) {
			oper=OP_INICIAR_PROCESO;
			strcpy(clave,argc[2]);
	
		} 
		else if (strcmp(argc[1],"matproc")==0 && argv == 3) {
			oper=OP_MATAR_PROCESO;
			strcpy(clave,argc[2]);
	
		} 
		else if (strcmp(argc[1],"conproc")==0 && argv == 3) {
			oper=OP_CONSULTAR_PROCESO;
			strcpy(clave,argc[2]);
	
		} 
		else if (strcmp(argc[1],"crerecu")==0 && argv >=5) {
			oper=OP_CREAR_RECURSO;
			strcpy(clave,argc[2]);
			strcpy(ruta,argc[3]);
			desc[0] = '\0';
			for (i = 4;i<=argv-2;i++) {
				strcat(desc,argc[i]);
				strcat(desc," ");
			}
			tiempo=atoi(argc[argv-1]);
		} 
		else if (strcmp(argc[1],"elirecu")==0 && argv == 3) {
			oper=OP_ELIMINAR_RECURSO;
			strcpy(clave,argc[2]);
		} 
		else if (strcmp(argc[1],"conrecu")==0 && argv == 3) {
			oper=OP_CONSULTAR_RECURSO;
			strcpy(clave,argc[2]);
	
		} 
		else {
			error();
		}
	
		P(sem_id,SEM_ADMIN);

		mem->oper = oper;
		strcpy(mem->ruta,ruta);
		strcpy(mem->clave,clave);
		strcpy(mem->desc,desc);	
		mem->tiempo=tiempo;

#ifdef CLIENSO_DEBUG
		fprintf(stderr,"CMD a mandar: \n");
		fprintf(stderr,"OPER: %d\n",mem->oper);
		fprintf(stderr,"CLAVE: %s\n",mem->clave);
		fprintf(stderr,"RUTA: %s\n",mem->ruta);
		fprintf(stderr,"DESC: %s\n",mem->desc);
		fprintf(stderr,"TIEMPO: %d\n",mem->tiempo);
#endif
		V(sem_id,SEM_MEMORIA);
		
		P(sem_id,SEM_RESPUESTA);

#ifdef CLIENSO_DEBUG
		fprintf(stderr,"OPER RESPUESTA: %d\n",mem->oper); // DEBUG
#endif

		if (oper==OP_CONSULTAR_PROCESO || oper==OP_CONSULTAR_RECURSO || mem->oper==RESPUESTA_ERROR)
			printf("%s\n",mem->desc);
	
		V(sem_id,SEM_ADMIN);	
	
		exit(0);
}
