package com.imyeyu.fx.ui.components;

import com.imyeyu.fx.ui.TimiFXUI;
import com.imyeyu.java.bean.CallbackArgReturn;
import javafx.beans.property.DoubleProperty;
import javafx.beans.property.StringProperty;
import javafx.scene.control.Label;
import javafx.scene.control.ProgressBar;
import javafx.scene.layout.StackPane;
import lombok.Getter;
import lombok.Setter;

/**
 * 标签进度。如果继承进度组件使用反射注入标签组件时，在设置标签文本会导致标签消失
 *
 * @author 夜雨
 * @since 2022-08-09 10:48
 */
@Getter
public class LabelProgressBar extends StackPane implements TimiFXUI {

	private static final String STYLE_CLASS = "label-progress-bar";

	/** 标签组件 */
	protected final Label label;

	/** 进度组件 */
	protected final ProgressBar bar;

	/** 标签转换回调，进度变换时触发回调 */
	@Setter
	protected CallbackArgReturn<Double, String> converter;

	/** 默认构造 */
	public LabelProgressBar() {
		getStylesheets().add(LabelProgressBar.class.getResource(RESOURCE + "style/components/label-progress-bar.css").toExternalForm());

		label = new Label();
		bar = new ProgressBar();
		bar.prefWidthProperty().bind(widthProperty());
		bar.getStyleClass().add(STYLE_CLASS);

		getChildren().addAll(bar, label);

		bar.progressProperty().addListener((obs, o, p) -> {
			if (converter != null) {
				if (p == null) {
					label.setText(converter.handler(-1D));
				} else {
					label.setText(converter.handler(p.doubleValue()));
				}
			}
		});
	}

	/**
	 * 获取当前标签文本
	 *
	 * @return 标签文本
	 */
	public String getText() {
		return label.getText();
	}

	/**
	 * 设置标签文本
	 *
	 * @param text 标签文本
	 */
	public void setText(String text) {
		label.setText(text);
	}

	/**
	 * 获取标签文本监听
	 *
	 * @return 标签文本监听
	 */
	public StringProperty textProperty() {
		return label.textProperty();
	}

	/**
	 * 设置进度值
	 *
	 * @param progress 进度值，取值范围 [0, 1]
	 */
	public void setProgress(double progress) {
		bar.setProgress(progress);
	}

	/**
	 * 获取进度值
	 *
	 * @return 进度值
	 */
	public double getProgress() {
		return bar.getProgress();
	}

	/**
	 * 获取进度监听
	 *
	 * @return 进度监听
	 */
	public DoubleProperty progressProperty() {
		return bar.progressProperty();
	}
}
