package org.springblade.flow.visual.onlinedev.common.formdata;

import java.util.ArrayList;
import java.util.List;

import org.springblade.flow.util.DateUtil;
import org.springblade.flow.visual.onlinedev.common.enums.DsType;

/**
 * 表单数据更新中间类
 * 
 * @author William
 * @date 2022年11月5日 上午10:34:55
 */
public class UpdateBean {

	private DsType dsType;
	private String tableName;
	private List<UpdateColumn> columnList;
	private List<UpdateColumn> whereList;

	/**
	 * 构造方法
	 * 
	 * @param tableName 表名
	 * @param tableAlias 表别名
	 * @param dsType 数据源类型
	 */
	public UpdateBean(String tableName, DsType dsType) {
		this.tableName = tableName;
		this.dsType = dsType;
		this.columnList = new ArrayList<>();
		this.whereList = new ArrayList<>();
	}

	public String getUpdateSql() {
		StringBuffer updateSql = new StringBuffer();
		updateSql.append("update " + tableName);
		updateSql.append(getSetSql());
		updateSql.append(getWhereSql());
		return updateSql.toString();
	}

	private String getSetSql() {
		StringBuffer setSql = new StringBuffer();
		setSql.append(" set ");
		for (int i = 0, size = columnList.size(); i < size; i++) {
			UpdateColumn col = columnList.get(i);
			Object data = col.getValue();
			String value = data == null || data.toString().equalsIgnoreCase("[]") ? null : data.toString();

			String dataType = col.getDataType();
			if (dataType.equalsIgnoreCase("varchar")) {
				value = "'" + value + "'";
			} else if (dataType.equalsIgnoreCase("datetime")) {
				// 时间日期类型 前端统一传递的都是时间戳
				long timestamp = Long.decode(value);
				value = DateUtil.daFormat(timestamp);
				value = "'" + value + "'";
				if (dsType == DsType.Oracle) {
					value = "to_date(" + value + ",'yyyy-mm-dd HH24:mi:ss')";
				}
			}
			setSql.append(col.getColumn() + "=" + value);
			if (i < size - 1) {
				setSql.append(", ");
			}
		}
		return setSql.toString();
	}

	private String getWhereSql() {
		StringBuffer whereSql = new StringBuffer();
		whereSql.append(" where ");
		for (int i = 0, size = whereList.size(); i < size; i++) {
			UpdateColumn col = whereList.get(i);
			Object data = col.getValue();
			String value = data == null ? null : data.toString();
			String dataType = col.getDataType();
			if (dataType.equalsIgnoreCase("varchar")) {
				value = "'" + value + "'";
			} else if (dataType.equalsIgnoreCase("datetime")) {
				// 时间日期类型 前端统一传递的都是时间戳
				value = "'" + value + "'";
				if (dsType == DsType.Oracle) {
					value = "to_date(" + value + ",'yyyy-mm-dd HH24:mi:ss')";
				}
			}
			if (i != 0) {
				whereSql.append(" and ");
			}

			whereSql.append(col.getColumn() + "=" + value);
		}
		return whereSql.toString();
	}

	/**
	 * 添加要更新的字段信息
	 * 
	 * @param column
	 */
	public void addSetColumn(UpdateColumn column) {
		columnList.add(column);
	}

	/**
	 * 添加更新语句的where条件
	 * 
	 * @param column
	 */
	public void addWhereColumn(UpdateColumn column) {
		whereList.add(column);
	}

	static class UpdateColumn {
		private String column;
		private Object value;
		private String dataType;

		/**
		 * 
		 * @param column
		 * @param value
		 * @param dataType varchar,datetime,decimal
		 */
		public UpdateColumn(String column, Object value, String dataType) {
			this.column = column;
			this.value = value;
			this.dataType = dataType;
		}

		public String getColumn() {
			return column;
		}

		public void setColumn(String column) {
			this.column = column;
		}

		public Object getValue() {
			return value;
		}

		public void setValue(Object value) {
			this.value = value;
		}

		public String getDataType() {
			return dataType;
		}

		public void setDataType(String dataType) {
			this.dataType = dataType;
		}
	}
}
