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 String[] 与数据库 VARCHAR 列进行互转。
 * 存储格式: JSON 数组，如 ["value1","value2","value3"]
 * 空数组: 存储为 "[]"
 * null值: 存储为 NULL
 * 
 * 原 PostgreSQL 版本使用 createArrayOf("text", ...) 创建原生数组，
 * 达梦数据库不兼容此 API，改为 VARCHAR + JSON 存储。
 */
@MappedTypes(String[].class)
@MappedJdbcTypes(JdbcType.VARCHAR)
public class ArrayStringTypeHandler extends BaseTypeHandler<String[]> {

    private static final ObjectMapper MAPPER = new ObjectMapper();

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

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

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

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

    private String[] parseArray(String value) {
        if (value == null || value.isEmpty()) {
            return new String[0];
        }
        try {
            return MAPPER.readValue(value, String[].class);
        } catch (JsonProcessingException e) {
            // 兼容旧的逗号分隔格式
            return value.split(",", -1);
        }
    }
}
