/*** 3. Dato il file testo.txt, produrre in output:
1) Numero di vocali, numero di consonanti, numero di cifre
2) Quale è la lettera più frequente e quella meno frequente
3) La dimensione del file in byte, il numero di spazi e il numero di linee totali
4) Eseguire inoltre una copia del file di testo (nel file testo2.txt) in modo che la copia sia così
modificata:
Le cifre da 0 a 9 vanno sostituite dal carattere * (asterisco)
Le lettere da ‘A’ a ‘Z’ e da ‘a’ a ‘z’ vanno sostituite dal cancelletto e a seguire dal codice ascii
della lettera. (esempio #65 al posto di A) ***/

#include <stdio.h>

// Funzione eVocale (serve a stabilire se un carattere e' una vocale)
int eVocale(int c) {
    if (c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u' ||
        c == 'A' || c == 'E' || c == 'I' || c == 'O' || c == 'U')
        return 1;
    return 0;
}

// Funzione eLettera (serve a stabilire se un carattere e' nell'alfabeto)
int eLettera(int c) {
    if ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z'))
        return 1;
    return 0;
}

// Funzione posizioneMax (ritorna la posizione espressa tra 0-25 della lettera piu' frequente)
int posizioneMax(int freq[]) {
    int i, indiceMax;

    indiceMax = 0;
    for (i = 1; i < 26; i++)
        if (freq[i] > freq[indiceMax])
            indiceMax = i;
    return indiceMax;
}

// Funzione posizioneMin (ritorna la posizione espressa tra 0-25 della lettera meno frequente)
int posizioneMin(int freq[]) {
    int i, indiceMin;

    indiceMin = -1;                       // -1 = non ho ancora trovato nessuna lettera
    for (i = 0; i < 26; i++)
        if (freq[i] > 0)                  // cerca solo le lettere esistenti nel testo
            if (indiceMin == -1 || freq[i] < freq[indiceMin])
                indiceMin = i;
    return indiceMin;
}

// Funzione copiaTrasformata (copia testo.txt in testo2.txt con le sostituzioni)
void copiaTrasformata() {
    FILE *fin, *fout;
    int c;

    fin = fopen("testo.txt", "r");
    fout = fopen("testo2.txt", "w");      //"w" crea il file da zero

    while ((c = fgetc(fin)) != EOF) {
        if (c >= '0' && c <= '9')
            fputc('*', fout);             // trasforma le cifre in *
        else if (eLettera(c))
            fprintf(fout, "#%d", c);      // trasforma le lettere in # + codice ascii
        else
            fputc(c, fout);               // copia il resto uguale
    }
    fclose(fin);
    fclose(fout);
}

int main() {
    FILE *f;
    int freq[26];
    int c, i, tot, spazi, righe, vocali, consonanti, cifre, ultimo;
    int iMax, iMin;

    // Azzeriamo tutti i contatori
    vocali = 0;
    consonanti = 0;
    cifre = 0;
    spazi = 0;
    righe = 0;
    tot = 0;
    ultimo = 0;
    for (i = 0; i < 26; i++)
        freq[i] = 0;

    f = fopen("testo.txt", "r");

    // Un solo giro per aggiornare tutti i contatori
    while ((c = fgetc(f)) != EOF) {       // fgetc legge 1 carattere; EOF = fine file
        tot++;                            // ogni carattere letto = 1 byte
        ultimo = c;

        if (c == ' ')
            spazi++;
        if (c == '\n')
            righe++;
        if (c >= '0' && c <= '9')
            cifre++;

        if (eLettera(c)) {
            if (eVocale(c))
                vocali++;
            else
                consonanti++;
            if (c >= 'A' && c <= 'Z')
                c = c + 32;               // trasforma le maiuscole in minuscole
            freq[c - 'a']++;              
        }
    }
    fclose(f);

    // se il file non finisce con un \n, l'ultima riga esiste lo stesso
    if (tot > 0 && ultimo != '\n')
        righe++;

    // 1) Visualizza il numero di vocali, consonanti e cifre
    printf("Vocali: %d\n", vocali);
    printf("Consonanti: %d\n", consonanti);
    printf("Cifre: %d\n", cifre);

    // 2) Visualizza la frequenza delle lettere
    if (vocali + consonanti == 0)
        printf("Non ci sono lettere nel file\n");
    else {
        iMax = posizioneMax(freq);
        iMin = posizioneMin(freq);
        printf("Lettera piu' frequente: %c (%d volte)\n", 'a' + iMax, freq[iMax]);
        printf("Lettera meno frequente: %c (%d volte)\n", 'a' + iMin, freq[iMin]);
    }

    // 3) Visualizza la dimensione del file, gli spazi e il numero di righe
    printf("Dimensione del file: %d byte\n", tot);
    printf("Spazi: %d\n", spazi);
    printf("Righe: %d\n", righe);

    // 4) Crea la copia trasformata
    copiaTrasformata();
    printf("Copia modificata salvata in testo2.txt\n");

    return 0;
}