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

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

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

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

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

    /**
     * 将 JSON 字符串解析为 String[]
     */
    static String[] parseJsonArray(String value) {
        if (value == null || value.isEmpty() || "[]".equals(value.trim())) {
            return new String[0];
        }
        if (!value.startsWith("[") || !value.endsWith("]")) {
            // 兼容旧的逗号分隔格式
            return value.split(",", -1);
        }
        String content = value.substring(1, value.length() - 1).trim();
        if (content.isEmpty()) {
            return new String[0];
        }
        List<String> list = new ArrayList<>();
        int pos = 0;
        int len = content.length();
        while (pos < len) {
            if (content.charAt(pos) == '"') {
                int end = pos + 1;
                while (end < len) {
                    if (content.charAt(end) == '"' && (end == 0 || content.charAt(end - 1) != '\\')) {
                        break;
                    }
                    end++;
                }
                String item = content.substring(pos + 1, end);
                item = item.replace("\\\"", "\"").replace("\\\\", "\\");
                list.add(item);
                pos = end + 1;
                // skip comma and whitespace
                while (pos < len && (content.charAt(pos) == ',' || content.charAt(pos) == ' ')) {
                    pos++;
                }
            } else {
                // unquoted value (comma-separated)
                int end = pos;
                while (end < len && content.charAt(end) != ',') {
                    end++;
                }
                list.add(content.substring(pos, end).trim());
                pos = end + 1;
            }
        }
        return list.toArray(new String[0]);
    }

    /**
     * 将 String[] 序列化为 JSON 数组字符串
     */
    static String toJsonArray(String[] 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("\"");
            if (array[i] != null) {
                sb.append(array[i].replace("\\", "\\\\").replace("\"", "\\\""));
            }
            sb.append("\"");
        }
        sb.append("]");
        return sb.toString();
    }
}
