package com.ytpm.handle;


import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.deser.std.StdDeserializer;

import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.TimeZone;

/**
 * 兼容多种格式的Date反序列化器
 *
 * @author lih
 * @date 2025-10-14 11:04
 */
public class MultiFormatDateDeserializer extends StdDeserializer<Date> {

    private static String defaultTimeZone;

    // 需要兼容的时间格式（按优先级排序）
    private static final List<String> SUPPORT_FORMATS = Arrays.asList(
            "yyyy-MM-dd'T'HH:mm:ss.SSSZ",  // 对应 2025-10-11T11:21:19.000+0800
            "yyyy-MM-dd HH:mm:ss",         // 对应 2025-10-11 11:21:19
            "yyyy-MM-dd"                   // 对应 2025-10-11
    );

    public MultiFormatDateDeserializer(String timeZone) {
        super(Date.class);
        defaultTimeZone = timeZone;
    }

    @Override
    public Date deserialize(JsonParser parser, DeserializationContext context) throws IOException {
        String dateStr = parser.getValueAsString();
        if (dateStr == null || dateStr.trim().isEmpty()) {
            return null;
        }

        // 尝试每种格式解析，成功则返回
        for (String format : SUPPORT_FORMATS) {
            try {
                SimpleDateFormat sdf = new SimpleDateFormat(format);
                sdf.setTimeZone(TimeZone.getTimeZone(defaultTimeZone));
                return sdf.parse(dateStr);
            } catch (ParseException e) {
                // 解析失败，继续尝试下一种格式
            }
        }

        // 所有格式都不匹配时抛出异常
        throw new IOException("不支持的时间格式: " + dateStr + "，请使用以下格式：" + SUPPORT_FORMATS);
    }

}
