package digital.laboratory.platform.entrustment.config;

import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import digital.laboratory.platform.sewage.entity.UpdateInfo;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedJdbcTypes;
import org.apache.ibatis.type.MappedTypes;

import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

@Slf4j
@MappedTypes({List.class})      // 指定与其关联的 Java 类型列表。 如果在 javaType 属性中也同时指定，则注解上的配置将被忽略。
@MappedJdbcTypes(JdbcType.JAVA_OBJECT)  // 注解指定与其关联的 JDBC 类型列表。 如果在 jdbcType 属性中也同时指定，则注解上的配置将被忽略。
// public class ProcessInfoListJsonHandler extends BaseMybatisList2JsonHandler<ProcessInfo> {
// }
public class ProcessInfoListJsonHandler extends BaseTypeHandler<List<UpdateInfo>> {

	@Override
	public void setNonNullParameter(PreparedStatement ps, int i, List<UpdateInfo> parameter, JdbcType jdbcType) throws SQLException {
		ps.setString(i, JSON.toJSONString(parameter));
	}

	@Override
	public List<UpdateInfo> getNullableResult(ResultSet rs, String columnName)
			throws SQLException {
		String data = rs.getString(columnName);
		//List<ProcessInfo> r = StringUtils.isBlank(data) ? null : JSON.parseArray(data, (Class<ProcessInfo>) getRawType());
System.out.println(String.format("ProcessInfoListJsonHandler.getNullableResult, data=%s", data));
		List<UpdateInfo> r = StringUtils.isBlank(data) ? null : JSON.parseArray(data, UpdateInfo.class);
		return r;
	}

	@Override
	public List<UpdateInfo> getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
		String data = rs.getString(columnIndex);
		return StringUtils.isBlank(data) ? null : JSON.parseArray(data, UpdateInfo.class);
	}

	@Override
	public List<UpdateInfo> getNullableResult(CallableStatement cs, int columnIndex)
			throws SQLException {
		String data = cs.getString(columnIndex);
		return StringUtils.isBlank(data) ? null : JSON.parseArray(data, UpdateInfo.class);
	}

	@Override
	public List<UpdateInfo> getResult(ResultSet rs, String columnName) throws SQLException {
		List<UpdateInfo> r = super.getResult(rs, columnName);
		return r;
	}

	@Override
	public List<UpdateInfo> getResult(ResultSet rs, int columnIndex) throws SQLException {
		return super.getResult(rs, columnIndex);
	}

	@Override
	public List<UpdateInfo> getResult(CallableStatement cs, int columnIndex) throws SQLException {
		return super.getResult(cs, columnIndex);
	}
}
