package com.zhentao.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 java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

/**
 * JSON类型处理器
 * 用于处理MySQL的JSON字段与Java String之间的转换
 */
@MappedJdbcTypes({JdbcType.VARCHAR, JdbcType.OTHER})
public class JsonTypeHandler extends BaseTypeHandler<String> {

    private static final ObjectMapper objectMapper = new ObjectMapper();

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

    @Override
    public String getNullableResult(ResultSet rs, String columnName) throws SQLException {
        String json = rs.getString(columnName);
        return convertJsonToString(json);
    }

    @Override
    public String getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        String json = rs.getString(columnIndex);
        return convertJsonToString(json);
    }

    @Override
    public String getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        String json = cs.getString(columnIndex);
        return convertJsonToString(json);
    }

    /**
     * 将JSON字符串转换为普通字符串
     * 如果是null或空，直接返回
     * 如果是有效的JSON数组，保持原样
     */
    private String convertJsonToString(String json) {
        if (json == null || json.trim().isEmpty()) {
            return null;
        }
        // 如果已经是JSON数组格式，直接返回
        if (json.startsWith("[") && json.endsWith("]")) {
            return json;
        }
        // 如果是JSON对象格式，也直接返回
        if (json.startsWith("{") && json.endsWith("}")) {
            return json;
        }
        // 其他情况也直接返回
        return json;
    }
}

