package rd.dao.type;

import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.type.*;

import java.sql.*;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

@Slf4j
//@MappedTypes(List<Integer>.class)
@MappedJdbcTypes(JdbcType.ARRAY)
public class IntegerListTypeHandler extends BaseTypeHandler<List<Integer>> {

    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, List<Integer> parameter, JdbcType jdbcType) throws SQLException {
        String typeName = "integer";

        Connection conn = ps.getConnection();
        Array array = conn.createArrayOf(typeName, parameter.toArray());
        ps.setArray(i, array);
    }

    @Override
    public List<Integer> getNullableResult(ResultSet rs, String columnName) throws SQLException {
        return getArray(rs.getArray(columnName));
    }

    @Override
    public List<Integer> getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        return getArray(rs.getArray(columnIndex));
    }

    @Override
    public List<Integer> getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        return getArray(cs.getArray(columnIndex));
    }

    private List<Integer> getArray(Array array) {
        if (array == null) {
            return null;
        }
        try {
            var arr = array.getArray();
            var result = new ArrayList<Integer>();

            if (arr instanceof Integer[] intArr) {
                Collections.addAll(result, intArr);
            } else if (arr instanceof Short[] shortArr) {
                for (Short shortVal : shortArr) {
                    result.add(shortVal.intValue());
                }
            } else if (arr instanceof Long[] longArr) {
                for (Long longVal : longArr) {
                    result.add(longVal.intValue());
                }
            }

            return result;
        } catch (Exception e) {
            log.error("类型转换出错：", e);
        }

        return null;
    }
}
