#include "input.h"
#include <string.h>
#include <ctype.h>

/*
 * ------------------------------------------------------------
 * HILFSFUNKTION:
 * Liest genau EIN Wort aus einer Datei und speichert es in 'buffer'.
 * 
 * - Trennt Wörter anhand von Komma, Semikolon oder Leerzeichen.
 * - Wandelt alle Buchstaben in GROSSBUCHSTABEN um (damit Tests passen).
 * - Gibt 1 zurück, wenn ein Wort gefunden wurde.
 * - Gibt 0 zurück, wenn nichts mehr zu lesen ist (EOF oder Fehler).
 * ------------------------------------------------------------
 */
static int readSingleWord(FILE *file, char *buffer, size_t bufferSize)
{
    int c;             // aktuelles Zeichen aus der Datei
    size_t len = 0;    // Anzahl der bisher eingelesenen Zeichen im aktuellen Wort

    // --- Sicherheitsprüfung: Sind die Übergabeparameter gültig? ---
    if (file == NULL || buffer == NULL || bufferSize == 0)
    {
        return 0; // nichts tun, wenn Datei oder Speicher ungültig ist
    }

    // --- 1. Führende Trennzeichen überspringen ---
    // Solange Kommas, Semikolons oder Leerzeichen kommen, einfach weiter lesen.
    // Erst wenn ein anderes Zeichen kommt, fängt das Wort an.
    while ((c = fgetc(file)) != EOF)
    {
        if (c == ',' || c == ';' || isspace((unsigned char)c))
        {
            continue; // noch kein Buchstabe -> weiter zum nächsten Zeichen
        }
        else
        {
            break; // erstes Nicht-Trennzeichen gefunden -> Wort beginnt hier
        }
    }

    // --- 2. Falls direkt EOF (End of File) erreicht wurde, kein Wort mehr vorhanden ---
    if (c == EOF)
    {
        return 0;
    }

    // --- 3. Erstes Zeichen des Wortes in den Buffer schreiben ---
    // Dabei gleich in Großbuchstaben umwandeln
    char upperChar = (char) toupper((unsigned char) c);
    buffer[len++] = upperChar;

    // --- 4. Rest des Wortes lesen, bis ein Trennzeichen oder das Dateiende erreicht ist ---
    while ((c = fgetc(file)) != EOF)
    {
        // Wenn Komma, Semikolon oder Leerzeichen -> Wort ist zu Ende
        if (c == ',' || c == ';' || isspace((unsigned char)c))
        {
            break;
        }

        // Nur schreiben, solange noch Platz im Buffer ist (letztes Zeichen für '\0' reservieren!)
        if (len < bufferSize - 1)
        {
            upperChar = (char) toupper((unsigned char) c); // Zeichen in Großbuchstaben
            buffer[len++] = upperChar;                     // Zeichen im Buffer speichern
        }
        // Wenn kein Platz mehr, restliche Zeichen ignorieren (Vermeidung von Speicherfehlern)
    }

    // --- 5. String beenden ---
    buffer[len] = '\0'; // Nullterminator am Ende -> macht aus dem Array einen C-String

    // --- 6. Erfolg melden ---
    return 1; // 1 = Wort erfolgreich eingelesen
}

/*
 * ------------------------------------------------------------
 * HAUPTFUNKTION:
 * Liest ALLE Wörter aus einer Datei und speichert sie in 'words'.
 * 
 * - Ruft die Hilfsfunktion 'readSingleWord()' mehrfach auf,
 *   um ein Wort nach dem anderen zu lesen.
 * - Kopiert jedes gefundene Wort in das große 'words'-Array.
 * - Zählt, wie viele Wörter tatsächlich gefunden wurden.
 * ------------------------------------------------------------
 */
int readWords(FILE *file, char words[][MAX_WORD_LEN], unsigned int maxWordCount)
{
    unsigned int count = 0;          // zählt, wie viele Wörter gefunden wurden
    char buffer[MAX_WORD_LEN];       // Zwischenspeicher für EIN Wort (kommt aus der Hilfsfunktion)

    // --- Sicherheitsprüfung ---
    // Datei darf nicht NULL sein, das Array muss existieren, und es muss Platz vorhanden sein.
    if (file == NULL || words == NULL || maxWordCount == 0)
    {
        return 0; // ungültige Eingaben -> keine Wörter gelesen
    }

    // --- Hauptschleife ---
    // Solange:
    //   - noch Platz im 'words'-Array ist (count < maxWordCount)
    //   - UND readSingleWord() ein neues Wort liefern kann
    while (count < maxWordCount && readSingleWord(file, buffer, sizeof(buffer)))
    {
        // --- 1. Wort aus dem Buffer ins große Array kopieren ---
        // strcpy wäre unsicher -> strncpy schützt vor Überlauf
        strncpy(words[count], buffer, MAX_WORD_LEN);

        // --- 2. Sicherstellen, dass das Wort immer korrekt endet ---
        // Wenn das Wort genau MAX_WORD_LEN Zeichen lang war,
        // könnte der '\0' durch strncpy fehlen -> hier wird er garantiert gesetzt.
        words[count][MAX_WORD_LEN - 1] = '\0';

        // --- 3. Zähler erhöhen -> nächstes Wort kommt in words[count+1] ---
        count++;
    }

    // --- Schleife beendet: entweder kein Wort mehr oder Array ist voll ---
    // Rückgabe: Anzahl der tatsächlich eingelesenen Wörter
    return count;
}