package com.Modules.etl.handler;

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.ArrayList;
import java.util.List;

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

    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, Integer[] parameter, JdbcType jdbcType) throws SQLException {
        ps.setString(i, toJsonArray(parameter));
    }

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

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

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

    /**
     * 将 JSON 字符串解析为 Integer[]
     */
    private Integer[] parseJsonArray(String value) {
        if (value == null || value.isEmpty() || "[]".equals(value.trim())) {
            return new Integer[0];
        }
        if (!value.startsWith("[")) {
            // 兼容旧的逗号分隔格式: "1,2,3"
            return parseCommaSeparated(value);
        }
        String content = value.substring(1, value.length() - 1).trim();
        if (content.isEmpty()) {
            return new Integer[0];
        }
        String[] parts = content.split(",");
        List<Integer> result = new ArrayList<>(parts.length);
        for (String part : parts) {
            String trimmed = part.trim();
            if (!trimmed.isEmpty()) {
                result.add(Integer.parseInt(trimmed));
            }
        }
        return result.toArray(new Integer[0]);
    }

    private Integer[] parseCommaSeparated(String value) {
        String[] parts = value.split(",");
        List<Integer> result = new ArrayList<>(parts.length);
        for (String part : parts) {
            String trimmed = part.trim();
            if (!trimmed.isEmpty()) {
                result.add(Integer.parseInt(trimmed));
            }
        }
        return result.toArray(new Integer[0]);
    }

    /**
     * 将 Integer[] 序列化为 JSON 数组字符串
     */
    static String toJsonArray(Integer[] array) {
        if (array == null) {
            return null;
        }
        if (array.length == 0) {
            return "[]";
        }
        StringBuilder sb = new StringBuilder("[");
        for (int i = 0; i < array.length; i++) {
            if (i > 0) sb.append(",");
            sb.append(array[i] != null ? array[i].toString() : "null");
        }
        sb.append("]");
        return sb.toString();
    }
}
