// Path: admin-offline/src/main/java/ch/ge/ve/offlineadmin/util/LogLevel.java
// public enum LogLevel {
//     OK("ok-text", FontAwesomeIcon.CHECK.name()),
//     WARN("warn-text", FontAwesomeIcon.EXCLAMATION_TRIANGLE.name()),
//     ERROR("error-text", FontAwesomeIcon.EXCLAMATION_CIRCLE.name());
// 
// 
//     private final String styleClass;
//     private final String glyphName;
// 
//     /**
//      * @param styleClass css style
//      * @param glyphName icon name
//      */
//     LogLevel(String styleClass, String glyphName) {
//         this.styleClass = styleClass;
//         this.glyphName = glyphName;
//     }
// 
//     /**
//      * Getter on the css style
//      * @return the css style
//      */
//     public String getStyleClass() {
//         return styleClass;
//     }
// 
//     /**
//      * Getter on the icon name
//      * @return the icon name
//      */
//     public String getGlyphName() {
//         return glyphName;
//     }
// }
// 
// Path: admin-offline/src/main/java/ch/ge/ve/offlineadmin/util/LogMessage.java
// public class LogMessage {
//     private final GlyphIcon glyphIcon;
//     private final String message;
// 
//     public LogMessage(LogLevel logLevel, String message) {
//         glyphIcon = new FontAwesomeIconView();
//         glyphIcon.setGlyphName(logLevel.getGlyphName());
//         glyphIcon.setGlyphSize(18);
//         glyphIcon.setStyleClass(logLevel.getStyleClass());
//         this.message = message;
//     }
// 
//     public GlyphIcon getGlyphIcon() {
//         return glyphIcon;
//     }
// 
//     public String getMessage() {
//         return message;
//     }
// 
//     @Override
//     public boolean equals(Object o) {
//         if (this == o) {
//             return true;
//         }
//         if (o == null || getClass() != o.getClass()) {
//             return false;
//         }
// 
//         LogMessage that = (LogMessage) o;
// 
//         if (glyphIcon != null ? !glyphIcon.equals(that.glyphIcon) : that.glyphIcon != null) {
//             return false;
//         }
//         return !(message != null ? !message.equals(that.message) : that.message != null);
// 
//     }
// 
//     @Override
//     public int hashCode() {
//         int result = glyphIcon != null ? glyphIcon.hashCode() : 0;
//         result = 31 * result + (message != null ? message.hashCode() : 0);
//         return result;
//     }
// }
// 
// Path: admin-offline/src/main/java/ch/ge/ve/offlineadmin/util/ProgressTracker.java
// public interface ProgressTracker {
//     /**
//      * Adds a message with specific log level indicator to the progress tracker
//      * @param message
//      * @param logLevel
//      */
//     void progressMessage(String message, LogLevel logLevel);
// 
//     /**
//      * Adds a message to the progress tracker, with level {@link LogLevel#OK}
//      * @param message
//      */
//     void progressMessage(String message);
// 
//     /**
//      * Sets the steps count
//      * @param stepCount
//      */
//     void setStepCount(int stepCount);
// 
//     /**
//      * Increments the steps count
//      */
//     void incrementStepCount();
// }


import javafx.fxml.FXML;
import javafx.scene.control.Label;
import javafx.scene.control.ProgressBar;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.Pane;
import java.io.IOException;
import ch.ge.ve.offlineadmin.util.LogLevel;
import ch.ge.ve.offlineadmin.util.LogMessage;
import ch.ge.ve.offlineadmin.util.ProgressTracker;
import de.jensd.fx.glyphs.GlyphIcon;
import javafx.application.Platform;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.Event;

        logTable.setItems(logMessages);
        ObservableList<TableColumn<LogMessage, ?>> tableColumns = logTable.getColumns();
        tableColumns.add(logLevelColumn);
        tableColumns.add(messageColumn);

        logTable.setEditable(false);
        // Prevent cell selection
        logTable.addEventFilter(MouseEvent.ANY, Event::consume);
        // Do not display a placeholder
        logTable.setPlaceholder(new Label(""));
        // Hide the header row
        logTable.widthProperty().addListener((observable, oldValue, newValue) -> {
            Pane header = (Pane) logTable.lookup("TableHeaderRow");
            if (header.isVisible()) {
                header.setMaxHeight(0);
                header.setMinHeight(0);
                header.setPrefHeight(0);
                header.setVisible(false);
            }
        });
        progressBar.setProgress(0f);
    }

    /**
     * Add a message to the log table, with level {@link LogLevel#OK}
     *
     * @param message the message to be added
     */
    public void logOnScreen(String message) {
// Path: admin-offline/src/main/java/ch/ge/ve/offlineadmin/util/LogLevel.java
// public enum LogLevel {
//     OK("ok-text", FontAwesomeIcon.CHECK.name()),
//     WARN("warn-text", FontAwesomeIcon.EXCLAMATION_TRIANGLE.name()),
//     ERROR("error-text", FontAwesomeIcon.EXCLAMATION_CIRCLE.name());
// 
// 
//     private final String styleClass;
//     private final String glyphName;
// 
//     /**
//      * @param styleClass css style
//      * @param glyphName icon name
//      */
//     LogLevel(String styleClass, String glyphName) {
//         this.styleClass = styleClass;
//         this.glyphName = glyphName;
//     }
// 
//     /**
//      * Getter on the css style
//      * @return the css style
//      */
//     public String getStyleClass() {
//         return styleClass;
//     }
// 
//     /**
//      * Getter on the icon name
//      * @return the icon name
//      */
//     public String getGlyphName() {
//         return glyphName;
//     }
// }
// 
// Path: admin-offline/src/main/java/ch/ge/ve/offlineadmin/util/LogMessage.java
// public class LogMessage {
//     private final GlyphIcon glyphIcon;
//     private final String message;
// 
//     public LogMessage(LogLevel logLevel, String message) {
//         glyphIcon = new FontAwesomeIconView();
//         glyphIcon.setGlyphName(logLevel.getGlyphName());
//         glyphIcon.setGlyphSize(18);
//         glyphIcon.setStyleClass(logLevel.getStyleClass());
//         this.message = message;
//     }
// 
//     public GlyphIcon getGlyphIcon() {
//         return glyphIcon;
//     }
// 
//     public String getMessage() {
//         return message;
//     }
// 
//     @Override
//     public boolean equals(Object o) {
//         if (this == o) {
//             return true;
//         }
//         if (o == null || getClass() != o.getClass()) {
//             return false;
//         }
// 
//         LogMessage that = (LogMessage) o;
// 
//         if (glyphIcon != null ? !glyphIcon.equals(that.glyphIcon) : that.glyphIcon != null) {
//             return false;
//         }
//         return !(message != null ? !message.equals(that.message) : that.message != null);
// 
//     }
// 
//     @Override
//     public int hashCode() {
//         int result = glyphIcon != null ? glyphIcon.hashCode() : 0;
//         result = 31 * result + (message != null ? message.hashCode() : 0);
//         return result;
//     }
// }
// 
// Path: admin-offline/src/main/java/ch/ge/ve/offlineadmin/util/ProgressTracker.java
// public interface ProgressTracker {
//     /**
//      * Adds a message with specific log level indicator to the progress tracker
//      * @param message
//      * @param logLevel
//      */
//     void progressMessage(String message, LogLevel logLevel);
// 
//     /**
//      * Adds a message to the progress tracker, with level {@link LogLevel#OK}
//      * @param message
//      */
//     void progressMessage(String message);
// 
//     /**
//      * Sets the steps count
//      * @param stepCount
//      */
//     void setStepCount(int stepCount);
// 
//     /**
//      * Increments the steps count
//      */
//     void incrementStepCount();
// }


// Path: admin-offline/src/main/java/ch/ge/ve/offlineadmin/controller/ConsoleOutputControl.java
import javafx.fxml.FXML;
import javafx.scene.control.Label;
import javafx.scene.control.ProgressBar;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.Pane;
import java.io.IOException;
import ch.ge.ve.offlineadmin.util.LogLevel;
import ch.ge.ve.offlineadmin.util.LogMessage;
import ch.ge.ve.offlineadmin.util.ProgressTracker;
import de.jensd.fx.glyphs.GlyphIcon;
import javafx.application.Platform;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.Event;


        logTable.setItems(logMessages);
        ObservableList<TableColumn<LogMessage, ?>> tableColumns = logTable.getColumns();
        tableColumns.add(logLevelColumn);
        tableColumns.add(messageColumn);

        logTable.setEditable(false);
        // Prevent cell selection
        logTable.addEventFilter(MouseEvent.ANY, Event::consume);
        // Do not display a placeholder
        logTable.setPlaceholder(new Label(""));
        // Hide the header row
        logTable.widthProperty().addListener((observable, oldValue, newValue) -> {
            Pane header = (Pane) logTable.lookup("TableHeaderRow");
            if (header.isVisible()) {
                header.setMaxHeight(0);
                header.setMinHeight(0);
                header.setPrefHeight(0);
                header.setVisible(false);
            }
        });
        progressBar.setProgress(0f);
    }

    /**
     * Add a message to the log table, with level {@link LogLevel#OK}
     *
     * @param message the message to be added
     */
    public void logOnScreen(String message) {
        logOnScreen(message, LogLevel.OK);