package fabrik.simulator.pic16f84;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class ParseFile {
    public static int[][] parseDatei(String dateiPfad) {
        List<String> zeilen = new ArrayList<>();

        // Bei diesem Schritt wird jetzt Zeile für Zeile das richtige Programm eingelesen
        try (BufferedReader leser = new BufferedReader(new FileReader(dateiPfad))) {
            String zeile;
            while ((zeile = leser.readLine()) != null) {
                zeilen.add(zeile);
            }
        } catch (IOException e) {
            System.err.println("Fehler beim Lesen der Datei: " + e.getMessage());
            e.printStackTrace();
        }

        // Initialisierung des Programmspeichers mit 1024 Speicherplätzen
        int[] programmspeicher = new int[1024]; // Wie viele Programmspeicherplätze gibt es? → 1024
        int[] zeilenspeicher = new int[1024];

        // Adresse und Befehle werden ignoriert und nur die Befehle werden in den Programmspeicher gespeichert

        for (int i = 0; i<zeilen.toArray().length; i++) {
            String zeile = zeilen.get(i);
            String[] teile = zeile.split("\\s+"); // Spaltenweise werden die einzelnen Befehle getrennt
            if (teile.length >= 2) {
                try {
                    int adresse = Integer.parseInt(teile[0], 16); // Adresse in Hexadezimal umwandeln
                    int befehl = Integer.parseInt(teile[1].substring(0, 4), 16); // Befehl extrahieren und in Hexadezimal umwandeln

                    // Ausgabe der eingelesenen Zeile
                    System.out.printf("Gelesene Zeile: %s%n", zeile);

                    zeilenspeicher[adresse] = i;
                    programmspeicher[adresse] = befehl; // Befehl im Programmspeicher speichern
                } catch (NumberFormatException e) {
                    // Wenn ein Fehler aufkommt, wird diese Zeile ignoriert funktioniert
                    System.err.println("Fehler beim Parsen einer Zeile: " + zeile);
                }
            }
        }

        return new int[][]{programmspeicher, zeilenspeicher};
    }
}
