package rd.dao.type;

import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedJdbcTypes;

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

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

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

        Connection conn = ps.getConnection();
        Array array = conn.createArrayOf(typeName, parameter.toArray());
        ps.setArray(i, array);
    }
    
    @Override
    public List<Long> getNullableResult(ResultSet rs, String columnName) throws SQLException {
        return getArray(rs.getArray(columnName));
    }

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

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

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

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

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

        return null;
    }
}
