package com.imyeyu.fx.ui.components.alert;

import com.imyeyu.fx.icon.TimiFXIcon;
import com.imyeyu.fx.icon.TimiIcon;
import com.imyeyu.fx.ui.TimiFXUI;
import com.imyeyu.io.IO;
import com.imyeyu.java.TimiJava;
import com.imyeyu.utils.Text;
import javafx.beans.binding.Bindings;
import javafx.collections.FXCollections;
import javafx.collections.ListChangeListener;
import javafx.collections.ObservableList;
import javafx.scene.control.SelectionMode;
import javafx.scene.control.TreeItem;
import lombok.Getter;

import java.io.File;

/**
 * 文件选择
 *
 * @author 夜雨
 * @since 2022-05-23 15:49
 */
public class AlertFileSelector extends AbstractAlertFile {

	/** 格式过滤列表 */
	@Getter
	protected final ObservableList<String> formatFilters;

	private String[] formatFiltersCache;

	/**
	 * 默认构造
	 *
	 * @param mode 选择模式
	 */
	public AlertFileSelector(SelectionMode mode) {
		super(mode);
		formatFilters = FXCollections.observableArrayList();

		// 确认
		confirm.disableProperty().bind(Bindings.createBooleanBinding(() -> {
			TreeItem<File> item = tree.getSelectionModel().getSelectedItem();
			return item == null || item.getValue().isDirectory();
		}, tree.getSelectionModel().selectedItemProperty()));

		getIcons().setAll(TimiFXIcon.rerender(TimiIcon.FILE));
		setTitle(TimiFXUI.MULTILINGUAL.text("file.select"));

		addItemFilter(file -> {
			if (file.isDirectory() || TimiJava.isEmpty(formatFiltersCache)) {
				return true;
			}
			return Text.eqIgnoreCaseOr(IO.fileExtension(file), formatFiltersCache);
		});
		formatFilters.addListener((ListChangeListener<String>) c -> {
			while (c.next()) {
				formatFiltersCache = formatFilters.toArray(new String[0]);
			}
		});
	}

	/**
	 * 添加文件格式过滤，默认显示所有格式的文件，添加过滤后将只显示过滤格式列表的文件
	 *
	 * @param formats 需要显示的文件格式
	 */
	public void addFormatFilters(String... formats) {
		formatFilters.addAll(formats);
	}

	/**
	 * 移除文件格式过滤
	 *
	 * @param formats 不需显示的文件格式
	 */
	public void removeFormatFilters(String... formats) {
		formatFilters.removeAll(formats);
	}
}
