package com.uddernetworks.mspaint.gui.elements;

import com.jfoenix.controls.JFXTextField;
import com.uddernetworks.mspaint.settings.Setting;
import com.uddernetworks.mspaint.settings.SettingsManager;
import javafx.beans.property.ObjectProperty;
import javafx.beans.property.SimpleObjectProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
import javafx.scene.Node;
import javafx.scene.control.Label;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Priority;
import javafx.scene.layout.Region;

public class SettingNumberField extends HBox {
    private ObjectProperty<Setting> settingProperty = new SimpleObjectProperty<>(null);
    private StringProperty labelProperty = new SimpleStringProperty();
    private Label label = new Label("Default");
    private NumberField numberField = new NumberField();

    public SettingNumberField() {
        getStyleClass().add("theme-text");
        setStyle("-fx-padding: 10px 0");
        label.getStyleClass().add("theme-text");
        numberField.getStyleClass().add("theme-text");


        Node spacer = getHSpacer(10);
        HBox.setHgrow(label, Priority.NEVER);
        HBox.setHgrow(numberField, Priority.NEVER);
        HBox.setHgrow(spacer, Priority.NEVER);

        label.setPrefHeight(25);
        getChildren().add(label);
        getChildren().add(spacer);
        getChildren().add(numberField);
        numberField.textProperty().addListener(((observable, oldValue, newValue) -> SettingsManager.getInstance().setSetting(settingProperty.get(), newValue.isEmpty() ? 0 : Integer.valueOf(newValue))));
    }

    public ObjectProperty<Setting> settingProperty() {
        return this.settingProperty;
    }

    public Setting getSetting() {
        return settingProperty().get();
    }

    public void setSetting(Setting setting) {
        settingProperty().set(setting);
        numberField.setText(SettingsManager.getInstance().getSetting(setting, 0).toString());
    }

    public StringProperty labelProperty() {
        return this.labelProperty;
    }

    public String getLabel() {
        return labelProperty().get();
    }

    public void setLabel(String label) {
        labelProperty().set(label);
        this.label.setText(label);
    }

    private Node getHSpacer(double width) {
        Region spacer = new Region();
        spacer.setPrefWidth(width);
        HBox.setHgrow(spacer, Priority.NEVER);
        return spacer;
    }

    public class NumberField extends JFXTextField {

        @Override
        public void replaceText(int start, int end, String text) {
            if (text.matches("[0-9]*")) {
                super.replaceText(start, end, text);
            }
        }

        @Override
        public void replaceSelection(String text) {
            if (text.matches("[0-9]*")) {
                super.replaceSelection(text);
            }
        }

    }
}