//
// Created by z004z80v on 05.11.2025.
//
#define BUFFER_SIZE 100
#define FILE_HEADER_STRING "__info2_image_file_format__"

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "imageInput.h"
int main()
{

        char buffer[BUFFER_SIZE];
        FILE* file = fopen("mnist_test.info2", "rb");

        // 1. Fehlerprüfung beim Öffnen der Datei
        if (file == NULL) {
            perror("Fehler beim Öffnen der Datei 'mnist_test.info2'");
            return 1; // Fehlercode zurückgeben
        }

        // 2. Daten lesen und sichere Null-Terminierung
        // Lies BUFFER_SIZE - 1 Bytes, um Platz für den Null-Terminator zu lassen
        size_t bytesRead = fread(buffer, sizeof(char), BUFFER_SIZE - 1, file);
        buffer[bytesRead] = '\0'; // Null-terminiere an der Stelle, bis zu der gelesen wurde

        // Optional: Debug-Ausgabe des tatsächlich gelesenen Inhalts
        printf("DEBUG: Gelesener Puffer (erste %zu Bytes): '%s'\n", bytesRead, buffer);

        // 3. Header-Vergleich
        // Stelle sicher, dass genug Daten für den Header gelesen wurden
        if (bytesRead < strlen(FILE_HEADER_STRING)) {
            fprintf(stderr, "Fehler: Datei ist zu klein für den Header. Gelesen: %zu Bytes.\n", bytesRead);
            fclose(file);
            return 1;
        }

        // Verwende strlen für den Vergleich, um genau die Header-Länge zu prüfen
        if (strncmp(buffer, FILE_HEADER_STRING, strlen(FILE_HEADER_STRING)) != 0) {
            fprintf(stderr, "Fehler: Dateikopf stimmt nicht überein! Erwartet: '%s'. Gefunden: '%.*s'.\n",
                    FILE_HEADER_STRING, (int)strlen(FILE_HEADER_STRING), buffer);
            fclose(file); // Datei schließen, bevor das Programm beendet wird
            return 1; // Fehlercode zurückgeben
        }

        // 4. Den numerischen Teil nach dem Header extrahieren und parsen
        char* dataStart = buffer + strlen(FILE_HEADER_STRING); // Zeiger nach dem Header
        char* endPtr; // Wird von strtol gesetzt, um das Ende der Zahl zu markieren

        // Setze errno auf 0, um Überlauf/Unterlauf von strtol zu erkennen
        errno = 0;
        // Wichtig: strtol auf 'dataStart' anwenden und Basis '10' verwenden
        unsigned int headerNumbers = strtol(dataStart, &endPtr, 10);

        // Fehlerprüfung für strtol
        if (dataStart == endPtr) { // Keine Ziffern gefunden
            fprintf(stderr, "Fehler: Konnte keine Header-Zahlen nach dem Dateikopf parsen. Zeichenkette: '%s'\n", dataStart);
            fclose(file);
            return 1;
        }
        if (errno == ERANGE) { // Zahl zu groß oder zu klein für unsigned int
            fprintf(stderr, "Fehler: Die geparste Zahl ist außerhalb des gültigen Bereichs für unsigned int.\n");
            fclose(file);
            return 1;
        }

        printf("DEBUG: Geparsste Header-Zahl: %u\n", headerNumbers);

        // Hier kommt deine Logik zur Aufteilung der Header-Zahl
        GrayScaleImageSeries series;
        series.images = NULL; // Initialisiere mit NULL, bevor Speicher zugewiesen wird

        series.count = headerNumbers / 10000;

        // Dynamische Speicherallokation für die Bilder, wenn series.count > 0 ist
        if (series.count > 0) {
            series.images = (GrayScaleImage*)malloc(series.count * sizeof(GrayScaleImage));
            if (series.images == NULL) {
                perror("Fehler bei der Speicherallokation für Bilder");
                fclose(file);
                return 1;
            }
            // Annahme: Alle Bilder in der Serie haben die gleiche Größe, die im Header kodiert ist.
            // Setze die Größe für das erste Bild im Array.
            // Wenn alle Bilder die gleiche Größe haben, könntest du diese Information auch direkt
            // in der GrayScaleImageSeries-Struktur speichern, anstatt in jedem einzelnen Bild.
            series.images[0].width = (headerNumbers / 100) % 100;
            series.images[0].height = headerNumbers % 100;
        } else {
            fprintf(stderr, "Warnung: Serienanzahl ist 0. Keine Bilder zu verarbeiten.\n");
        }


        printf("Series count: %u\n", series.count);
        // Nur ausgeben, wenn auch Bilder allokiert wurden
        if (series.count > 0) {
            printf("Width: %u\n", series.images[0].width);
            printf("Height: %u\n", series.images[0].height);
        } else {
            printf("Width: N/A\n");
            printf("Height: N/A\n");
        }


        // 5. Speicher freigeben und Datei schließen
        if (series.images != NULL) {
            free(series.images);
        }
        fclose(file);

        return 0; // Erfolgreiche Ausführung
    }

