package com.pjilisense.flxai.handle;

import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;

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

/**
 * UUID数组类型处理器
 */
public class UUIDArrTypeHandler extends BaseTypeHandler<List<UUID>> {

    /**
     * 设置参数
     *
     * @param ps        PreparedStatement 对象
     * @param i         参数索引
     * @param parameter UUID 列表
     * @param jdbcType  JDBC 类型
     * @throws SQLException SQL异常
     */
    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, List<UUID> parameter, JdbcType jdbcType) throws SQLException {
        if (parameter != null) {
            Array array = ps.getConnection().createArrayOf("uuid", parameter.toArray());
            ps.setArray(i, array);
        } else {
            ps.setNull(i, Types.ARRAY);
        }
    }


    /**
     * 获取结果
     *
     * @param resultSet 结果集
     * @param columnName 列名
     * @return UUID 列表
     * @throws SQLException SQL异常
     */
    @Override
    public List<UUID> getNullableResult(ResultSet resultSet, String columnName) throws SQLException {
        return getUUIDList(resultSet.getArray(columnName));
    }


    /**
     * 获取结果
     *
     * @param rs          结果集
     * @param columnIndex 列索引
     * @return UUID 列表
     * @throws SQLException SQL异常
     */
    @Override
    public List<UUID> getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        return getUUIDList(rs.getArray(columnIndex));
    }


    /**
     * 获取结果
     *
     * @param cs          CallableStatement 对象
     * @param columnIndex 列索引
     * @return UUID 列表
     * @throws SQLException SQL异常
     */
    @Override
    public List<UUID> getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        return getUUIDList(cs.getArray(columnIndex));
    }


    /**
     * 获取 UUID 列表
     *
     * @param array SQL 数组对象
     * @return UUID 列表
     * @throws SQLException SQL异常
     */
    private List<UUID> getUUIDList(Array array) throws SQLException {
        if (array == null) {
            return null;
        }
        Object[] uuidArray = (Object[]) array.getArray();
        List<UUID> result = new ArrayList<>();
        for (Object obj : uuidArray) {
            result.add((UUID) obj);
        }
        return result;
    }
}

