package yem.base.common.module.version.dynamic;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import kd.bos.bill.BillShowParameter;
import kd.bos.bill.OperationStatus;
import kd.bos.dataentity.entity.LocaleString;
import kd.bos.entity.datamodel.IDataModel;
import kd.bos.form.FormShowParameter;
import kd.bos.form.IFormView;
import kd.bos.form.ShowType;
import kd.bos.form.control.Control;
import kd.bos.form.field.ComboEdit;
import kd.bos.form.field.ComboItem;
import kd.bos.form.plugin.AbstractFormPlugin;
import kd.bos.lang.Lang;

import java.util.*;

/**
 * 变更履历_单据详情-表单插件
 * @description:
 * @author longh
 * @date 2022年4月27日 上午10:45:51
 */
public class VersionResumeBillInfoEdit extends AbstractFormPlugin {
	public static final String HighLight = "VersionResume_HighLight";
	public static final String HighLightColor = "#e5e5e5";

	/**
	 * 在创建新数据后进行处理，主要用于初始化版本列表和展示单据。
	 * 调用父类的afterCreateNewData方法，然后根据传入的事件对象进行后续处理。
	 * @param evt 事件对象，包含创建新数据后所需的信息。
	 */
	@Override
	public void afterCreateNewData(EventObject evt) {
		super.afterCreateNewData(evt);
		// 获取当前视图
		IFormView view = this.getView();
		// 获取视图的展示参数
		FormShowParameter showParameter = view.getFormShowParameter();
		// 从展示参数中获取自定义参数"data"，用于解析单据信息
		JSONObject data = showParameter.getCustomParam("data");
		// 如果"data"不存在，则直接返回，不进行后续处理
		if(data == null) {
			return;
		}
		// 从"data"中获取单据列表的JSON字符串和变更单JSON字符串
		String billsJson = data.getString("billsJson");
		String yem_changebill = data.getString("yem_changebill");
		// 从"data"中获取主键ID
		Long pkid = data.getLong("pkid");

		// 初始化版本列表，用于存储所有单据的版本号
		List<Integer> versions = new ArrayList<>();
		// 将billsJson解析为JSONArray
		JSONArray billsArray = JSONArray.parseArray(billsJson);
		// 遍历所有单据，筛选出与当前主键ID不同的单据，并提取其版本号
		for (int i = 0; i < billsArray.size(); i++) {
			JSONObject bill = billsArray.getJSONObject(i);
			if(pkid.longValue() != bill.getLong("id").longValue()) {
				versions.add(bill.getInteger("yem_version"));
			}
		}
		// 对版本号进行排序
		Collections.sort(versions);
		// 初始化下拉列表项集合，用于存储排序后的版本号
		List<ComboItem> entryItems = new ArrayList<>();
		// 获取当前语言代码
		String currLCId = Lang.get().toString();
		// 逆序遍历版本号列表，创建并添加ComboItem到entryItems中
		for (int i = versions.size()-1; i >= 0; i--) {
			ComboItem comboItem = new ComboItem();
			comboItem.setValue("" + versions.get(i));
			comboItem.setCaption(new LocaleString(currLCId, "" + versions.get(i)));
			entryItems.add(comboItem);
		}
		// 获取名为"yem_vnum"的下拉列表编辑器，并设置其下拉列表项为entryItems
		ComboEdit entryEditor = (ComboEdit) this.getView().getControl("yem_vnum");
		entryEditor.setComboItems(entryItems);

		// 调用showBill方法，展示变更单
		this.showBill(view, yem_changebill, pkid, new HashMap<>());
	}


	/**
	 * 展示指定的单据。
	 *
	 * @param view            当前视图。
	 * @param yem_changebill  单据ID。
	 * @param pkId            主键ID。
	 * @param customParams    自定义参数。
	 */
	private void showBill(IFormView view, String yem_changebill, Object pkId, Map<String, Object> customParams) {
		// 创建BillShowParameter对象，用于配置单据的展示参数。
		BillShowParameter showBill = new BillShowParameter();
		// 设置自定义参数，这些参数可以被单据展示逻辑使用，以定制展示内容或行为。
		showBill.setCustomParams(customParams);
		// 设置单据的展示状态为查看（VIEW）。
		showBill.setStatus(OperationStatus.VIEW);
		// 配置单据的展示方式为在容器内展示，并设置目标键为"yem_billinfo"，这通常用于指定单据展示的特定区域或框架。
		showBill.getOpenStyle().setShowType(ShowType.InContainer);
		showBill.getOpenStyle().setTargetKey("yem_billinfo");//单据界面面板
		// 设置单据的唯一标识符和主键ID，这些标识符用于定位和获取要展示的具体单据。
		showBill.setFormId(yem_changebill);
		showBill.setPkId(pkId);
		// 调用视图的showForm方法，传入配置好的单据展示参数，实现在当前视图中显示单据。
		view.showForm(showBill);
	}
	/**
	 * 注册事件监听器，添加版本高亮的点击监听。
	 *
	 * @param e 事件对象。
	 */
	@Override
	public void registerListener(EventObject e) {
		super.registerListener(e);
		this.addClickListeners(new String[] { "yem_highlight" });
	}

	/**
	 * 处理点击事件，实现版本高亮功能。
	 *
	 * @param evt 事件对象。
	 */
	@Override
	public void click(EventObject evt) {
		super.click(evt);
		// 从事件源中获取控制台键值，并转换为小写
		String key = ((Control) evt.getSource()).getKey().toLowerCase();
		// 根据键值进行不同操作的分支
		switch (key) {
			// 处理"yem_highlight"键值对应的逻辑
			case "yem_highlight":
				// 获取当前视图和模型
				IFormView view = this.getView();
				IDataModel model = this.getModel();
				// 获取展示参数
				FormShowParameter showParameter = view.getFormShowParameter();
				// 从模型中获取版本号
				String yem_vnum = (String) model.getValue("yem_vnum");
				// 如果版本号为空或为空字符串，则提示用户选择版本
				if(yem_vnum == null || yem_vnum.isEmpty()) {
					view.showTipNotification("请选择要比较的版本。");
					return;
				}
				// 从展示参数中获取自定义参数
				JSONObject data = showParameter.getCustomParam("data");
				// 如果自定义参数不存在，则直接返回
				if(data == null) {
					return;
				}
				// 从自定义参数中获取相关数据
				String billsJson = data.getString("billsJson");
				String yem_changebill = data.getString("yem_changebill");
				Long pkid = data.getLong("pkid");

				// 创建自定义参数映射，用于后续高亮显示
				Map<String, Object> customParams = new HashMap<>();
				// 解析 billsJson 为数组
				JSONArray billsArray = JSONArray.parseArray(billsJson);
				// 遍历 bills 数组，寻找与版本号匹配的条目，并将其 id 存入 customParams
				for (int i = 0; i < billsArray.size(); i++) {
					JSONObject bill = billsArray.getJSONObject(i);
					String yem_version = bill.getString("yem_version");
					if(yem_version.equals(yem_vnum)) {
						customParams.put(HighLight, bill.get("id"));
					}
				}
				// 调用方法，显示匹配版本的账单
				this.showBill(view, yem_changebill, pkid, customParams);

//			IFormView childView = this.getView().getView(childPageId);
//			Map<String, Object> param = new HashMap<>();
//	        param.put(ClientProperties.BackColor, "#FFFF77");
//
//			childView.updateControlMetadata("yem_version", param);
//			this.getView().sendFormAction(childView);
			break;
		default:
			break;
		}
	}
	
}
