package com.Modules.etl.handler;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
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;

/**
 * 整型数组类型处理器 - 达梦数据库兼容版本（JSON格式）
 * 
 * 将 Java Integer[] 与数据库 VARCHAR 列进行互转。
 * 存储格式: JSON 数组，如 [1,2,3]
 * 空数组: 存储为 "[]"
 * null值: 存储为 NULL
 * 
 * 原 PostgreSQL 版本使用 createArrayOf("integer", ...) 创建原生数组，
 * 达梦数据库不兼容此 API，改为 VARCHAR + JSON 存储。
 */
@MappedTypes(Integer[].class)
@MappedJdbcTypes(JdbcType.VARCHAR)
public class ArrayIntegerTypeHandler extends BaseTypeHandler<Integer[]> {

    private static final ObjectMapper MAPPER = new ObjectMapper();

    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, Integer[] parameter, JdbcType jdbcType) throws SQLException {
        try {
            ps.setString(i, MAPPER.writeValueAsString(parameter));
        } catch (JsonProcessingException e) {
            throw new SQLException("Failed to serialize Integer[] to JSON", e);
        }
    }

    @Override
    public Integer[] getNullableResult(ResultSet rs, String columnName) throws SQLException {
        return parseArray(rs.getString(columnName));
    }

    @Override
    public Integer[] getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        return parseArray(rs.getString(columnIndex));
    }

    @Override
    public Integer[] getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        return parseArray(cs.getString(columnIndex));
    }

    private Integer[] parseArray(String value) {
        if (value == null || value.isEmpty()) {
            return new Integer[0];
        }
        try {
            return MAPPER.readValue(value, Integer[].class);
        } catch (JsonProcessingException e) {
            // 兼容旧的逗号分隔格式
            String[] parts = value.split(",", -1);
            Integer[] result = new Integer[parts.length];
            for (int i = 0; i < parts.length; i++) {
                String part = parts[i].trim();
                result[i] = part.isEmpty() ? null : Integer.parseInt(part);
            }
            return result;
        }
    }
}
