package com.imyeyu.fx.ui;

import com.imyeyu.fx.utils.BorderBuilder;
import com.imyeyu.fx.utils.bg.BackgroundFillBuilder;
import com.imyeyu.fx.utils.layout.Layout;
import com.imyeyu.lang.multi.ResourcesMultilingual;
import com.sun.javafx.css.StyleManager;
import javafx.geometry.Insets;
import javafx.geometry.VPos;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.SeparatorMenuItem;
import javafx.scene.control.TableColumn;
import javafx.scene.effect.DropShadow;
import javafx.scene.layout.Background;
import javafx.scene.layout.Border;
import javafx.scene.layout.GridPane;
import javafx.scene.paint.Color;

import java.util.Objects;

/**
 * @author 夜雨
 * @version 2024-04-13 14:18
 */
public interface TimiFXUI {

	/** 静态资源路径 */
	String RESOURCE = "/timifx/";

	String RESOURCE_STYLE = RESOURCE + "/style";

	/** 样式文件 */
	String CSS_STYLE = resource("style/style.css");

	/** 控件默认样式文件 */
	String CSS_USER_AGENT = resource("style/user-agent.css");

	/** 全局字体替换 */
	String CSS_FONT = resource("style/font.css");

	ResourcesMultilingual MULTILINGUAL = new ResourcesMultilingual();

	/**
	 * 获取静态资源路径
	 *
	 * @param path 相对静态资源目录的路径
	 *
	 * @return 静态资源绝对路径
	 */
	private static String resource(String path) {
		return Objects.requireNonNull(TimiFXUI.class.getResource(RESOURCE + path)).toExternalForm();
	}

	/**
	 * 应用全局样式
	 *
	 * @param scene 场景
	 * @param stylesheets 追加的样式表
	 */
	static void applyStyle(Scene scene, String... stylesheets) {
		if (!Boolean.TRUE.equals(scene.getProperties().get(CSS_USER_AGENT))) {
			StyleManager.getInstance().addUserAgentStylesheet(scene, CSS_USER_AGENT);
			scene.getProperties().put(CSS_USER_AGENT, true);
		}
		if (!scene.getStylesheets().contains(CSS_STYLE)) {
			scene.getStylesheets().add(CSS_STYLE);
		}
		if (!scene.getStylesheets().contains(CSS_FONT)) {
			scene.getStylesheets().add(CSS_FONT);
		}
		for (String stylesheet : stylesheets) {
			if (!scene.getStylesheets().contains(stylesheet)) {
				scene.getStylesheets().add(stylesheet);
			}
		}
	}


	/**
	 *
	 *
	 * @author 夜雨
	 * @since 2024-04-13 11:51
	 */
	interface Colorful {

		/** 白色 */
		Color WHITE = Color.valueOf("#FFF");

		/** 品红 */
		Color RED = Color.valueOf("#F30");

		/** 褐色 */
		Color BROWN = Color.valueOf("#A67D7B");

		/** 黑色 */
		Color BLACK = Color.valueOf("#000");

		/** 橙色 */
		Color ORANGE = Color.valueOf("#F60");

		/** 黄色 */
		Color YELLOW = Color.valueOf("#FF0");

		/** 绿色 */
		Color GREEN = Color.valueOf("#393");

		/** 深绿 */
		Color DARK_GREEN = Color.valueOf("#373");

		/** 灰色 */
		Color GRAY = Color.valueOf("#666");

		/** 天蓝 */
		Color BLUE = Color.valueOf("#008DCB");

		/** 浅蓝 */
		Color LIGHT_BLUE = Color.valueOf("#DDEAF0");

		/** 灰白（程序默认底色 F4F4F4） */
		Color GRAY_WHITE = Color.valueOf("#F4F4F4");

		/** 亮灰 */
		Color LIGHT_GRAY = Color.valueOf("#B5B5B5");

		/** 深灰 */
		Color DARK_GRAY = Color.valueOf("#333");

		/** 少女粉 */
		Color PINK = Color.valueOf("#FF7A9B");

		/** 透明 */
		Color TRANSPARENT = Color.TRANSPARENT;

		// ---------- 聚焦颜色 ----------

		/** 聚焦颜色 - 默认 */
		Color FOCUSED_DEFAULT = Color.valueOf("#177CB0");

		/** 聚焦颜色 - 亮 */
		Color FOCUSED_LIGHT = Color.valueOf("#55B0DF");

		/** 聚焦颜色 - 暗 */
		Color FOCUSED_DARK = Color.valueOf("#0B6C9E");

		// ---------- 图标 ----------


		/** 图标颜色 */
		Color ICON = DARK_GRAY;

		/** 图标禁用颜色 */
		Color ICON_DISABLED = Color.valueOf("#939393");

		/** 图标指向颜色 */
		Color ICON_HOVER = LIGHT_GRAY;

		// ---------- 边框 ----------

		/** 默认边框颜色 */
		Color BORDER = LIGHT_GRAY;
	}

	/**
	 * @author 夜雨
	 * @version 2024-04-13 11:53
	 */
	interface Stroke {

		/** 透明边框 */
		Border TP = BorderBuilder.solid(Colorful.TRANSPARENT).build();

		/** 默认边框 */
		Border DEFAULT = BorderBuilder.solid(Colorful.BORDER).build();

		/** 禁用边框 */
		Border DISABLE = BorderBuilder.solid("#E1E1E1").build();

		/** 聚焦边框 */
		Border FOCUSED = BorderBuilder.solid(Colorful.BORDER).build();

		/** 上边框 */
		Border TOP = BorderBuilder.solid(Colorful.BORDER).top().build();

		/** 左边框 */
		Border LEFT = BorderBuilder.solid(Colorful.BORDER).left().build();

		/** 右边框 */
		Border RIGHT = BorderBuilder.solid(Colorful.BORDER).right().build();

		/** 下边框 */
		Border BOTTOM = BorderBuilder.solid(Colorful.BORDER).bottom().build();

		/** 除了上边框 */
		Border EX_TOP = BorderBuilder.solid(Colorful.BORDER).exceptTop().build();

		/** 除了左边框 */
		Border EX_LEFT = BorderBuilder.solid(Colorful.BORDER).exceptLeft().build();

		/** 除了右边框 */
		Border EX_RIGHT = BorderBuilder.solid(Colorful.BORDER).exceptRight().build();

		/** 除了下边框 */
		Border EX_BOTTOM = BorderBuilder.solid(Colorful.BORDER).exceptBottom().build();

		/** 上右边框 */
		Border TR = BorderBuilder.solid(Colorful.BORDER).width(1, 1, 0, 0).build();

		/** 右下边框 */
		Border RB = BorderBuilder.solid(Colorful.BORDER).width(0, 1, 1, 0).build();

		/** 左下边框 */
		Border BL = BorderBuilder.solid(Colorful.BORDER).width(0, 0, 1, 1).build();

		/** 左上边框 */
		Border LT = BorderBuilder.solid(Colorful.BORDER).width(1, 0, 0, 1).build();

		/** 水平边框，边的方向而非位置 */
		Border H = BorderBuilder.solid(Colorful.BORDER).width(1, 0).build();

		/** 垂直边框，边的方向而非位置 */
		Border V = BorderBuilder.solid(Colorful.BORDER).width(0, 1).build();
	}

	/**
	 * @author 夜雨
	 * @version 2024-04-13 11:53
	 */
	interface CSS {

		/** CSS Minecraft AE 字体 */
		String MINECRAFT = "minecraft-ae";

		// ---------- CSS 边框 ----------

		/** CSS 所有边框 */
		String BORDER_ALL = "border-all";

		/** CSS 无边框 */
		String BORDER_N = "border-n";

		/** CSS 上边框 */
		String BORDER_T = "border-t";

		/** CSS 右边框 */
		String BORDER_R = "border-r";

		/** CSS 下边框 */
		String BORDER_B = "border-b";

		/** CSS 左边框 */
		String BORDER_L = "border-l";

		/** CSS 上右边框 */
		String BORDER_TR = "border-tr";

		/** CSS 右下边框 */
		String BORDER_RB = "border-rb";

		/** CSS 左下边框 */
		String BORDER_BL = "border-bl";

		/** CSS 左上边框 */
		String BORDER_LT = "border-lt";

		/** CSS 上下右边框 */
		String BORDER_TRB = "border-trb";

		/** CSS 上下左边框 */
		String BORDER_BLT = "border-blt";

		/** CSS 左右下边框 */
		String BORDER_RBL = "border-rbl";

		/** CSS 左右上边框 */
		String BORDER_LTR = "border-ltr";

		/** CSS 上下边框 */
		String BORDER_TB = "border-tb";

		/** CSS 左右边框 */
		String BORDER_LR = "border-lr";

		// ---------- CSS 内边距 ----------

		/** CSS 无内边距 */
		String PADDING_N = "padding-n";

		// ---------- CSS 背景 ----------

		/** CSS 透明背景 */
		String BG_TP = "bg-tp";

		/** CSS 纯白背景 */
		String BG_WHITE = "bg-white";

		/** CSS 纯黑背景 */
		String BG_BLACK = "bg-black";

		/** CSS 默认背景 */
		String BG_DEFAULT = "bg-default";

		/** CSS 按钮背景 */
		String BG_BUTTON = "bg-button";

		/** CSS 按钮背景（只有背景，没有事件样式） */
		String BG_BUTTON_STATIC = "bg-button-static";

		// ---------- CSS 其他 ----------

		/** CSS 光标指向透明度 */
		String HOVER_OPACITY = "hover-opacity";

		/** CSS 滚动面板的滚动条左侧边框 */
		String SP_BORDER = "sp-border";

		/** CSS 可编辑表格 */
		String EDITABLE_TABLE = "editable-table";
	}

	/**
	 * @author 夜雨
	 * @version 2024-04-13 11:53
	 */
	interface BG {

		/** FX 默认背景（#F4F4F4） */
		Background DEFAULT = BackgroundFillBuilder.solid(Colorful.GRAY_WHITE).build();

		/** 灰色背景 */
		Background GRAY = BackgroundFillBuilder.solid(Colorful.GRAY).build();

		/** 亮灰背景 */
		Background LIGHT_GRAY = BackgroundFillBuilder.solid(Colorful.LIGHT_GRAY).build();

		/** 纯黑背景 */
		Background BLACK = BackgroundFillBuilder.solid(Colorful.BLACK).build();

		/** 纯白背景 */
		Background WHITE = BackgroundFillBuilder.solid(Colorful.WHITE).build();

		/** 透明背景 */
		Background TRANSPARENT = BackgroundFillBuilder.solid(Colorful.TRANSPARENT).build();

		/** 淡蓝背景 */
		Background LIGHT_BLUE = BackgroundFillBuilder.solid(Colorful.LIGHT_BLUE).build();

		/** 聚焦色背景 */
		Background FOCUSED = BackgroundFillBuilder.solid(Colorful.FOCUSED_DEFAULT).build();

		/** 指向背景，通常用于提示组件尺寸响应拖动 */
		Background HOVER = BackgroundFillBuilder.solid("#0007").build();

		/** 渐变的标题背景 */
		Background TITLE = BackgroundFillBuilder.linear("#DDD", "#F4F4F400").toRight().build();

		/** 填充的标题背景 */
		Background TITLE_FILL = BackgroundFillBuilder.solid("#DDD").build();
	}

	/**
	 * @author 夜雨
	 * @version 2024-04-13 11:55
	 */
	interface Shadow {

		Insets PADDING = new Insets(8);

		/** 窗体投影 */
		DropShadow POPUP = new DropShadow() {{
			setRadius(8);
			setOffsetX(0);
			setOffsetY(0);
			setSpread(.05);
			setColor(Color.valueOf("#3337"));
		}};

		/** 图片投影 */
		DropShadow IMAGE = new DropShadow() {{
			setRadius(6);
			setOffsetX(0);
			setOffsetY(0);
			setSpread(.05);
			setColor(Color.valueOf("#3336"));
		}};

		/** 下边投影 */
		DropShadow DOWN = new DropShadow() {{
			setRadius(6);
			setOffsetX(0);
			setOffsetY(2);
			setSpread(.05);
			setColor(Color.valueOf("#3334"));
		}};
	}

	/**
	 * 快速构建菜单分割线
	 *
	 * @return 菜单分割线
	 */
	static SeparatorMenuItem sep() {
		return new SeparatorMenuItem();
	}

	/**
	 * 构建通用灰色标签
	 *
	 * @return 灰色标签
	 */
	static Label label() {
		return label("");
	}

	/**
	 * 构建通用灰色标签
	 *
	 * @param text 标签文本
	 * @return 灰色标签
	 */
	static Label label(String text) {
		Label label = new Label(text);
		label.setTextFill(Colorful.GRAY);
		return label;
	}

	static Label gridLabel(String text) {
		Label label = Layout.margin.top(GridPane::setMargin, TimiFXUI.label(text), 4);
		GridPane.setValignment(label, VPos.TOP);
		return label;
	}

	/**
	 * 构建通用标题标签
	 *
	 * @param text 标题文本
	 * @return 标签
	 */
	static Label title(String text) {
		return title(text, Border.EMPTY, null);
	}

	/**
	 * 构建通用标题标签
	 *
	 * @param text   标题文本
	 * @param border 边框
	 * @return 标签
	 */
	static Label title(String text, Border border) {
		return title(text, border, null);
	}

	/**
	 * 构建通用标题标签
	 *
	 * @param text   标题文本
	 * @param border 边框
	 * @param icon   图标
	 * @return 标签
	 */
	static Label title(String text, Border border, Node icon) {
		Label label = new Label(text, icon);
		label.setBorder(border);
		label.setPadding(new Insets(4, 6, 4, 6));
		label.setMaxWidth(Double.MAX_VALUE);
		label.setBackground(BG.TITLE);
		return label;
	}

	/**
	 * 构建空的表格列，通常用于触发事件
	 *
	 * @param width  预设宽度
	 * @param sClass 表格数据类对象
	 * @param tClass 列数据类对象
	 * @param <S>    表格数据类
	 * @param <T>    列数据类
	 * @return 列对象
	 */
	static <S, T> TableColumn<S, T> emptyTableColumn(double width, Class<S> sClass, Class<T> tClass) {
		TableColumn<S, T> col = new TableColumn<>();
		col.setSortable(false);
		col.setResizable(false);
		col.setReorderable(false);
		col.setPrefWidth(width);
		return col;
	}
}
