#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_PALAVRA 50
#define MAX_LINHA 300


typedef struct estatistica_texto{
    int num_letras;
    int num_espacos;
    int num_pontos_finais;
    int num_virgulas;
    int num_ponto_virgulas;
    int num_dois_pontos;
    int num_exclamacoes;
    int num_interrogacoes;
    int num_abr_paren;
    int num_fecha_paren;
    int num_aspas;
    int num_caracteres;
    int num_palavras;
    int num_linhas;
    float tam_medio_palavras;
    char maior_palavra[MAX_PALAVRA];
}estatistica;

int pontuacao(char c){

    if (c == '.' || c==',' || c==';' || c==':' || c=='!' || c =='?'|| c=='"' || c=='(' || c==')'){
        return 1;
    }
    return 0;
}


void processar_linha(char *linha,estatistica * est){

    char palavra[MAX_PALAVRA]="";

    for (int i=0; linha[i]!='\0';){
        est->num_caracteres++;

        if (linha[i]==' '){
            est->num_espacos++;
        }
        else if (linha[i]=='.'){
            est->num_pontos_finais++;
        }
        else if (linha[i]==','){
            est->num_virgulas++;
        }
        else if (linha[i]==';'){
            est->num_ponto_virgulas++;
        }
        else if (linha[i]==':'){
            est->num_dois_pontos++;
        }
        else if (linha[i]=='!'){
            est->num_exclamacoes++;
        }
        else if (linha[i]=='?'){
            est->num_interrogacoes++;
        }
        else if (linha[i]=='"'){
            est->num_aspas++;
        }
        else if (linha[i]=='('){
            est->num_abr_paren++;
        }
        else if (linha[i]==')'){
            est->num_fecha_paren++;
        }
        else{
            int j=0;
            while(linha[i]!=' ' && linha[i]!='\0' && !pontuacao(linha[i])){
                palavra[j] = linha[i];
                est->num_letras++;
                i++;
                j++;
            }
            palavra[j]='\0';
            est->tam_medio_palavras += (float)strlen(palavra);
            est->num_palavras++;
            if (strlen(est->maior_palavra)<strlen(palavra)){
                strcpy(est->maior_palavra,palavra);
            }
            i--;
        }
        i++;
    }
}

int ler_linha(FILE *f,char *linha){

    int i;
    char c;

    for (i=0; (i<MAX_LINHA-1) && (c=fgetc(f))!=EOF &&  c!='\n';i++){
        linha[i] = c;
    }
    if (c=='\n'){
        linha[i]='\n';
        i++;
    }

    linha[i]='\0';

    return i-1;
}


void inverter(char *s){

    char * s1;

    int tam = strlen(s);

    for (int i=0;i<tam/2;i++){
        s[i] = s[tam-i-1];
    }

}

void analisar_texto(char * nome_arq, estatistica * est){

    char linha[MAX_LINHA] = "--------------------------------------------------";

    FILE * f = fopen("texto.txt","r");
    int num_lidos=0;

    while ((num_lidos = ler_linha(f,linha))>=0){
        est->num_linhas++;
        processar_linha(linha,est);
        printf("%d %s",num_lidos,linha);
    }
    est->tam_medio_palavras /= (float)est->num_palavras;

    fclose(f);
}


int main()
{
    estatistica est = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.0,""};

    analisar_texto("texto.txt",&est);

    printf("\n");
    printf("Numero de linhas = %d\n",est.num_linhas);
    printf("Numero de espacos = %d\n",est.num_espacos);
    printf("Numero de pontos = %d\n",est.num_pontos_finais);
    printf("Numero de virgulas = %d\n",est.num_virgulas);
    printf("Numero de pontos virgulas = %d\n",est.num_ponto_virgulas);
    printf("Numero de dois pontos = %d\n",est.num_dois_pontos);
    printf("Numero de exclamacoes = %d\n",est.num_exclamacoes);
    printf("Numero de interrogacoes = %d\n",est.num_interrogacoes);
    printf("Numero de aspas = %d\n",est.num_aspas);
    printf("Numero de abre parenteses = %d\n",est.num_abr_paren);
    printf("Numero de fecha parenteses = %d\n",est.num_fecha_paren);
    printf("Numero de caracteres = %d\n",est.num_caracteres);
    printf("Numero de palavras = %d\n",est.num_palavras);
    printf("Tamanho medio palavras = %f\n",est.tam_medio_palavras);
    printf("Maior palavra = %s\n",est.maior_palavra);
    printf("\n");


    return 0;
}
