package com.gxwebsoft.common.core.config;

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonToken;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;

import java.io.IOException;
import java.util.List;

/**
 * JSON 数组 ↔ String 反序列化器
 * <p>
 * 数据库字段存储的是 JSON 字符串（如 ["url1","url2"]），
 * 前端传来的是 JSON 数组；此反序列化器把两种形式都正确处理为 String 存库。
 *
 * @author WebSoft
 * @since 2026-03-30
 */
@Slf4j
public class JsonArrayToStringDeserializer extends JsonDeserializer<String> {

    private static final ObjectMapper MAPPER = new ObjectMapper();

    @Override
    public String deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
        // 如果前端传的已经是字符串，直接返回
        if (p.currentToken() == JsonToken.VALUE_STRING) {
            String text = p.getText();
            if (text == null || text.trim().isEmpty()) {
                return null;
            }
            return text;
        }
        // 如果前端传的是数组，序列化成 JSON 字符串
        if (p.currentToken() == JsonToken.START_ARRAY) {
            List<String> list = MAPPER.readValue(p, MAPPER.getTypeFactory()
                    .constructCollectionType(List.class, String.class));
            if (list == null || list.isEmpty()) {
                return null;
            }
            return MAPPER.writeValueAsString(list);
        }
        // null
        if (p.currentToken() == JsonToken.VALUE_NULL) {
            return null;
        }
        return p.getValueAsString();
    }

    @Override
    public String getNullValue(DeserializationContext ctxt) {
        return null;
    }
}
