package projetarm_v2.simulator.ui.javafx;

import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.scene.text.Text;
import org.dockfx.DockNode;
import projetarm_v2.simulator.boilerplate.ArmSimulator;
import projetarm_v2.simulator.core.io.IO8Segment;

import java.util.ArrayList;

public class EightSegmentDisplay {
    HBox mainPane;
    DockNode dockNode;

    Text address;
    ArrayList<ArrayList<ImageView>> images;
    ArrayList<IO8Segment> segments;

    private ArmSimulator simulator;

    /**
     * creates a 8segment window
     * @param simulator the simulator
     */
    public EightSegmentDisplay(ArmSimulator simulator){

        this.simulator = simulator;
        this.mainPane = new HBox();
        images = new ArrayList<>();
        segments = new ArrayList<>();


        
        for(int j = 0; j<15; j++) {
            VBox currentVBox = new VBox();
            this.mainPane.getChildren().add(currentVBox);
            AnchorPane imagesContainer = new AnchorPane();
            currentVBox.getChildren().add(imagesContainer);
            imagesContainer.getChildren().add(new ImageView(new Image(getClass().getResource("/resources/8_segment/8seg_base.png").toExternalForm())));
            images.add(new ArrayList<>());
            for (int i = 0; i < 8; i++) {
                ImageView currentImage = new ImageView(new Image(getClass().getResource("/resources/8_segment/8seg_" + (i + 1) + ".png").toExternalForm()));
                imagesContainer.getChildren().add(currentImage);
                images.get(j).add(currentImage);
                currentImage.setVisible(false);
            }
            segments.add(simulator.newIO8Segment());
            currentVBox.getChildren().add(new Text("0x" + Long.toHexString(segments.get(j).getSegment(0).getPortAddress())));
        }

        this.dockNode = new DockNode(mainPane, "8 segment view");
        dockNode.setPrefSize(460,666);

    }

    /**
     * gets and display the new 8segments state
     */
    public void refresh() {
        for (int j=0; j<15; j++){
            for (int i=0; i<8; i++){
                images.get(j).get(i).setVisible(segments.get(j).getSegmentState(i));
            }
        }
    }

    /**
     * get the dock node
     * @return dockNode
     */
    public DockNode getNode() {
        return dockNode;
    }

    /**
     * called when user pushes the close button on the dockfx node
     * closes the node and removes the components
     */
    public void close() {
        this.dockNode.close();
        for(IO8Segment segment : segments){
            this.simulator.removeIOComponent(segment);
        }
    }
}