#include <stdio.h>
#ifndef NO_STDLIB_H
#include <stdlib.h>
#endif
#include <string.h>#include "cgi-util.h"

#define MAX_ENTRIES 100

#define MAX_TENTATIVAS	9
/*
 * esta função retira os espaços no final de uma string
 */
char* trim(char* str)
{
	int i;
		for (i = strlen(str)-1; i >= 0; i--)	{
		if (str[i] == ' ')
			str[i] = '\0';
		else
			break;	}	return str;
}
char** le_palavras(char* nome_fich, int* comp){
	FILE* f = fopen(nome_fich, "rt");
	int nlinhas, i;
	char** vec_palavras;
	char buffer[255];	
	if (f == NULL)
		return NULL;

	fscanf(f, "%d\n", &nlinhas);
	vec_palavras = (char**)calloc(nlinhas, sizeof(char*));
		i = -1;
	while (!feof(f) && i < nlinhas)
	{		i++;
		fscanf(f, "%s\n", buffer);
		trim(buffer);		vec_palavras[i] = (char*)malloc(sizeof(char)*strlen(buffer)+1);
		strcpy(vec_palavras[i], buffer);	}	fclose(f);
	
	*comp = i;
	return vec_palavras;}void liberta(char** vec, int n){	int i;	
	for (i = 0; i < n; i++)
	{		free(vec[i]);
	}}
int escolher_palavra(char* palavra, int nlen){
	char** vec_pal;
	int n_pal, idx;

	vec_pal = le_palavras("palavras.txt", &n_pal);	if (vec_pal == NULL || n_pal == -1)		return 0;
	srand(time(NULL));
	idx = rand() % n_pal;			strcpy(palavra, vec_pal[idx]);
			liberta(vec_pal, n_pal);	free(vec_pal);
	
	return 1;}
void erro(){	puts("<html><body>");
	puts("<strong>aparentemente não usou a nossa página do Jogo do Enforcado</strong><br>");	puts("Clique <a href='http://www.dei.isep.ipp.pt/~psousa/aulas/amb-des/enforcado.htm'>aqui</a>");
	puts("</body></html>");
}

/*
 * esta função verifica se alguma das letras existentes no argumento 
 * 'seq_letras' corresponde ao argumento 'letra' 
 * comparando inclusive caracteres acentuados e maisuculas/minusculas
 *
 * ex:
 *		existe("axC", 'ç') -> 1
 *		existe("avf", 'i') -> 0
 *		existe("axC", 'é') -> 0
 *		existe("axC", 'ã') -> 1
 *		existe("axC", 'A') -> 1 */
int existe(char* seq_letras, char letra)
{
	int r;	/* printf("|%c->", letra); */	
	/* caracteres acentuados */	if (letra == 'à' || letra == 'á' || letra == 'ã' || letra == 'ä' || letra == 'â')		letra = 'a';
	if (letra == 'è' || letra == 'é' || letra == 'ë' || letra == 'ê')		letra = 'e';
	if (letra == 'ì' || letra == 'í' || letra == 'ï' || letra == 'î')		letra = 'i';
	if (letra == 'ò' || letra == 'ó' || letra == 'õ' || letra == 'ö' || letra == 'ô')		letra = 'o';
	if (letra == 'ù' || letra == 'ú' || letra == 'ü' || letra == 'û')		letra = 'u';
	if (letra == 'ñ')		letra = 'n';
	if (letra == 'ç')		letra = 'c';
	r = (strchr(seq_letras, letra) != NULL);	/* tentar maiusculas */
	if (!r)	{
		letra = 'A' + letra - 'a';
		r = (strchr(seq_letras, letra) != NULL);	}
		
	/* printf("%c:%d|", letra, r); */
		/* verificar a existencia */
	return r;}int main(int argc, char *argv[])
{
entry entries[MAX_ENTRIES];
int i, m, p;
char value[80];

int acabou = -1, desistir = -1;char palavra[80];
char letras_ant[80];
char letra[2];
int ntent = 0;
int ncertas = 0;

	/* inicializações */
	letras_ant[0] = '\0';
	letra[0] = letra[1] = 0;
	palavra[0] = '\0';
	

	/**CGI: inicializar o modulo de CGI **/
	m = cgi_init(entries, sizeof(entries)/sizeof(entries[0]));
	if (m < 0)
	{
		/**CGI: reportar erro no modulo **/
		cgi_send_error(m);
		exit(1);
	}
	/**CGI: indicar tipo de conteudo da resposta **/  
	cgi_send_header(HEADER_TYPE_TEXT_HTML);

	/**CGI: procurar por um valor **/	desistir = cgi_get_value_from_key(value, sizeof(value), "quit", 0, entries, m);
	acabou = cgi_get_value_from_key(value, sizeof(value), "acabou", 0, entries, m);
	p = cgi_get_value_from_key(palavra, sizeof(palavra), "palavra", 0, entries, m);	if (p == -1 || strlen(palavra) == 0 || acabou != -1)
	{		/* 1ª vez => gerar palavra e iniciar o jogo */		if (!escolher_palavra(palavra, sizeof(palavra)))
		{
			/* Erro */			puts("<html><body>");
			puts("<strong>Erro ao ler o ficheiro de palavras");
			puts("</body></html>");
			exit(1);		}
		ntent = 1;
	}
	else
	{		/* continuar um jogo */		
		/**CGI: procurar por um valor **/
		p = cgi_get_value_from_key(value, sizeof(value), "letra", 0, entries, m);		if (p == -1)
		{			erro();			exit(1);
		}
		letra[0] = value[0];
		/**CGI: procurar por um valor **/
		p = cgi_get_value_from_key(letras_ant, sizeof(letras_ant), "letras_ant", 0, entries, m);		if (p == -1)
		{			erro();			exit(1);
		}		strcat(letras_ant, letra);
		/**CGI: procurar por um valor **/
		p = cgi_get_value_from_key(value, sizeof(value), "n_tent", 0, entries, m);		if (p == -1)
		{			erro();			exit(1);
		}		sscanf(value, "%d", &ntent);		ntent++;
	}
	/* construir documento */	puts("<html><body>");
	puts("<H1>Jogo do Enforcado</H1>\n");	puts("<form name=main action='http://www.dei.isep.ipp.pt/cgi-bin/user/psousa/enforcado.cgi' method='post'>");
	printf("<input type='hidden' name='palavra' value='%s'>\n", palavra);	printf("<input type='hidden' name='letras_ant' value ='%s'>\n", letras_ant);	printf("<input type='hidden' name='n_tent' value ='%d'>\n", ntent);
		puts("<p><span style='font-size: 20pt;'>");
	ncertas = 0;	for (i = 0; i < strlen(palavra); i++)
	{		if (existe(letras_ant, palavra[i]))
		{			printf(" %c \n", palavra[i]);			ncertas++;
		}		else			puts(" _ ");
	}	puts("</span></p>");
	
	if (ncertas == strlen(palavra))
	{		puts("<p>Parabéns</p>");
		printf("<p>Acertou à %dª tentativa</p>\n", ntent-1);		puts("<input type='hidden' name='acabou' value='true'>");
		/*puts("Clique <a href='http://www.dei.isep.ipp.pt/~psousa/aulas/amb-des/enforcado.htm'>aqui</a> para jogar de novo");*/
		puts("<input type=submit name=submit value='Novo Jogo'>");	}
	else 
	{		if (ntent >= MAX_TENTATIVAS || desistir != -1)
		{			if (desistir != -1)
				puts("<p>É pena que tenha desistido.</p>");			else
				puts("<p>Infelizmente perdeu.</p>");
			printf("<p>A palavra era: <strong>%s</strong></p>\n", palavra);			/* puts("Clique <a href='http://www.dei.isep.ipp.pt/~psousa/aulas/amb-des/enforcado.htm'>aqui</a> para jogar de novo"); */			puts("<input type=submit name=submit value='Novo Jogo'>");			puts("<input type='hidden' name='acabou' value='true'>");
		}		else
		{			printf("<p>Esta é a sua %dª tentativa (max. %d)</p>\n", ntent, MAX_TENTATIVAS);
			puts("<p>Que letra pretende: <input type='text' name='letra' value='' size='1' maxlength='1'>");
			puts("<input type='submit' name='submit' value='Jogar'></p>");			if (ntent != 1)
				puts("<p><em>Já tentou as seguintes letras: </em><strong>");			for (i = 0; i < strlen(letras_ant); i++)
			{				printf(" %c \n", letras_ant[i]);			}
			puts("</strong></p>");			puts("<hr><input type='submit' name='quit' value='Desistir'>");
		}
	}	puts("</form>");
	puts("</body></html>");	/**CGI: libertar recursos do modulo **/
	cgi_uninit(entries, m);		return 0;
}

