#include <iostream>
#include <fstream>
#include <print>
#include <string>

// Konstanten für Dateiname und Anzahl der Buchstaben im Alphabet
const char* const FILENAME = "../../04_Data/test.txt";
constexpr auto NUMOFCHARS = 'Z' - 'A' + 1;

// main() Funktion
int main()
{
    // Datei oeffnen
    std::ifstream inFile(FILENAME);
    if (!inFile)
    {
        std::println("Kann Datei {} nicht oeffnen!",FILENAME);
        exit(1);
    }

    // Zähler für die Anzahl der Buchstaben definieren
    // und mit 0 initialisieren
    int characters[NUMOFCHARS]{};
    // Zähler für Sonderzeichen wie z.B. '.' oder ',' usw.
    auto specialChar = 0;

    // Schleife zum Einlesen der Datei
    do
    {
        // String für eingelesene Zeile aus der Datei
        std::string line;
        // Eine Zeile aus der Datei einlesen
        // und falls Dateiende nicht erreicht
        if (std::getline(inFile, line); !inFile.eof())
        {
            // Komplette Zeile durchlaufen
            for (auto zeichen : line)
            {
                // Falls Buchstabe im String a...z
                if ((zeichen >= 'a') && (zeichen <= 'z'))
                    characters[zeichen - 'a']++;
                else
                    // Falls Buchstabe im String A...Z
                    if ((zeichen >= 'A') && (zeichen <= 'Z'))
                        characters[zeichen - 'A']++;
                    else
                        // Sonderzeichen erhöhen
                        specialChar++;
            }
        }
    } while (!inFile.eof());

    // Datei wieder schliessen!
    inFile.close();

    // Ergebnis ausgeben
    std::println("Anzahl der Buchstaben in der Datei {}", FILENAME);
    // Alle Buchstabenzähler ausgeben
    for (auto index = 0; index < NUMOFCHARS; index++)
    {
        // Nach jedem 5. Buchstaben eine neue Zeile beginnen
        if (index % 5 == 0)
            std::cout << '\n';
        std::print("{:c}: {:3}\t", index + 'a', characters[index]);
    }
    // Noch Anzahl der Sonderzeichen ausgeben
    std::println("\nSonderzeichen: {}", specialChar);
}
