/*TODO list
- Calcular bien tamaños de los arrays -> mallocs
- Funciones de gpg: encriptación, desencriptación
- Mirar funcionamiento MIME
- Controlar fallos de entrada
- Programar soporte para varias listas
*/


#include <stdio.h>
#include <unistd.h>
#include "gpgme.h"

#define PGP_HEADER "-----BEGIN PGP MESSAGE-----"
#define PGP_FOOTER "-----END PGP MESSAGE-----"

#define DEBUG
#define VERBOSE

#define BUFFER_MAX 10240
#define MAX_GPG_MESSAGE 4096
#define LINE_MAX 120

main(int argc, char *argv[])
{
	char original_mail[BUFFER_MAX];
	int len, ch;
	char lista[12];
	if (argc != 2)
	{
		printf ("Invalid parameters");
		exit(-1);
	}
	else
		strcat (lista,argv[1]);

 	for (len = 0; (ch = getchar()) != EOF;) 
	{
                if (len >= sizeof(original_mail)) 
		{
                	fprintf(stderr, "message too large!\n");
			_exit;
                }
                original_mail[len++] = ch;
        }
	split_data(original_mail, len);
}

//Try to get from, subject and gpg data fields
split_data(char input[BUFFER_MAX], int nchars)
{
	int i,j,k,l, fin_gpg, ini_gpg;
	char line[LINE_MAX];
	char from[100];
	char to[100];
	char subject[120];
	char gpg_message[MAX_GPG_MESSAGE];
	char *message;
	char *t = NULL;
	int plain_sw=1;
	int from_sw=1;
	int to_sw=1;
	int subj_sw=1;

	// i = número de caracteres
	// j = número de caracter dentro de una línea
	for (i=0,j=0; i<=nchars; i++)
	{
		if  (input[i]!='\n')
			line[j++]=input[i];
		else 
		{
			//Comprobamos que la longitud de la linea no exceda el buffer (LINE_MAX)
			if (j>LINE_MAX)
			{
				printf ("\nMaximun line buffer exceded\nMail not accepted for processing.");
				exit (1);
			}
			line[j]='\0';
			#if defined DEBUG && defined VERBOSE
			printf ("\nLINE[%d]> %s",j, line);
			#endif
			//En este punto tenemos la linea entera almacenada en line
			if (!strncmp(line,"From: ", 6) && from_sw)
			{
				for (k=6,l=0; k<j; k++,l++)
					from[l]=line[k];
				from[l--]='\0';
				from_sw=0;
			}
			if (!strncmp(line,"To: ", 4) && to_sw)
			{
				for (k=4,l=0; k<j; k++,l++)
					to[l]=line[k];
				to[l--]='\0';
				to_sw=0;
			}
				
			if (!strncmp(line,"Subject: ", 9) && subj_sw)
			{
				for (k=9,l=0; k<j; k++,l++)
					subject[l]=line[k];
				subject[l--]='\0';
				subj_sw=0;
			}
			if (!strncmp(line, PGP_HEADER, 27))
			{
				plain_sw+=2;
				ini_gpg=i-27;
			}
			if (!strncmp(line, PGP_FOOTER, 25))
			{
				plain_sw+=4;
				fin_gpg=i;
			}
			j=0;
		}
	} //END FOR
	if (plain_sw==7)
		for (i=ini_gpg,j=0; i<=fin_gpg; i++,j++)
			gpg_message[j]=input[i];
	else	
		printf ("\nWrong pgp header: Assumming plain text\n");

	#ifdef DEBUG
	printf ("\n");
	printf ("DEBUG> Mensaje de: %s\n", from);
	printf ("DEBUG> Para: %s\n",to);
	printf ("DEBUG> Título: %s\n",subject);
	printf ("DEBUG> Comienzo cabecera encontrado en pos: %d\n", ini_gpg);
	printf ("DEBUG> Fin cabecera encontrado en pos: %d\n", fin_gpg);
	printf ("DEBUG> El mensaje encriptado es:\n%s",gpg_message);
	#endif

	//Desencriptamos. Esta llamada deberá realizarse desde main()
	decrypt_gpg(&gpg_message);

	return 0;
}

void decrypt_gpg(message)
{
	gpgme_data_s *context = nil;
	gpgme_recipients_s *recipient = nil;
	gpgme_key_s *key = nil;
	gpgme_data_s *data = nil;
	gpgme_data_s *data_out = nil;
}

