package application.displaybehaviour;

import application.model.ModelConfigObject;
import application.model.modelobjects.KafkaBrokerConfig;
import application.model.modelobjects.KafkaListenerConfig;
import application.model.modelobjects.KafkaSenderConfig;
import application.model.modelobjects.KafkaTopicConfig;
import javafx.beans.property.ObjectProperty;
import javafx.beans.property.SimpleObjectProperty;
import javafx.collections.ListChangeListener;
import javafx.scene.control.ListView;
import javafx.scene.control.Tab;
import javafx.scene.control.TabPane;

import java.util.List;

public class DefaultModelConfigObjectsGuiInformer implements ModelConfigObjectsGuiInformer {
    private final TabPane tabPane;
    private final ListView<KafkaBrokerConfig> brokersListView;
    private final ListView<KafkaTopicConfig> topicsListView;
    private final ListView<KafkaSenderConfig> messagesListView;
    private final ListView<KafkaListenerConfig> listenersListView;
    private final ObjectProperty<ModelConfigObject> lastRemovedObject = new SimpleObjectProperty<>();
    private final ListChangeListener<ModelConfigObject> listChangeListener = getListChangeListener();

    public DefaultModelConfigObjectsGuiInformer(TabPane tabPane,
                                                ListView<KafkaBrokerConfig> brokersListView,
                                                ListView<KafkaTopicConfig> topicsListView,
                                                ListView<KafkaSenderConfig> messagesListView,
                                                ListView<KafkaListenerConfig> listenersListView) {
        this.tabPane = tabPane;
        this.brokersListView = brokersListView;
        this.topicsListView = topicsListView;
        this.messagesListView = messagesListView;
        this.listenersListView = listenersListView;

        bindToRemovedEventsListeners();
    }

    @Override
    public ObjectProperty<ModelConfigObject> lastRemovedObjectProperty() {
        return lastRemovedObject;
    }

    @Override
    public ModelConfigObject selectedObject() {

        final Tab selectedTab = tabPane.getSelectionModel().getSelectedItem();
        final ListView<?> listView = (ListView<?>) selectedTab.getContent();

        if (listView == brokersListView) {
            return brokersListView.getSelectionModel().getSelectedItem();
        } else if (listView == topicsListView) {
            return topicsListView.getSelectionModel().getSelectedItem();
        } else if (listView == messagesListView) {
            return messagesListView.getSelectionModel().getSelectedItem();
        } else if (listView == listenersListView) {
            return listenersListView.getSelectionModel().getSelectedItem();
        }

        return null;
    }

    private ListChangeListener<ModelConfigObject> getListChangeListener() {
        return c -> {
            while (c.next()) {
                if (c.wasRemoved()) {
                    final List<? extends ModelConfigObject> removed = c.getRemoved();
                    removed.forEach(lastRemovedObject::setValue);
                }
            }
        };
    }

    private void bindToRemovedEventsListeners() {

        brokersListView.getItems().addListener(listChangeListener);
        topicsListView.getItems().addListener(listChangeListener);
        messagesListView.getItems().addListener(listChangeListener);
        listenersListView.getItems().addListener(listChangeListener);

    }

}