package com.sckw.transport.api.model.dto;

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.deser.std.StdDeserializer;
import lombok.extern.slf4j.Slf4j;

import java.io.IOException;
import java.time.LocalDateTime;
import java.time.OffsetDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;

/**
 * 自定义 LocalDateTime 反序列化器
 * 支持解析带时区的 ISO 8601 格式（如：2025-12-05T00:00:00.000+00:00）
 * 自动转换为 LocalDateTime（忽略时区信息）
 */
@Slf4j
public class LocalDateTimeDeserializer extends StdDeserializer<LocalDateTime> {

    private static final long serialVersionUID = 1L;

    public LocalDateTimeDeserializer() {
        super(LocalDateTime.class);
    }

    @Override
    public LocalDateTime deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
        String dateTimeStr = p.getText();
        if (dateTimeStr == null || dateTimeStr.trim().isEmpty()) {
            return null;
        }

        dateTimeStr = dateTimeStr.trim();

        // 优先尝试解析带时区的格式（如：2025-12-05T00:00:00.000+00:00）
        // OffsetDateTime 可以解析带时区偏移的 ISO 8601 格式
        try {
            OffsetDateTime offsetDateTime = OffsetDateTime.parse(dateTimeStr);
            return offsetDateTime.toLocalDateTime();
        } catch (DateTimeParseException e) {
            // 如果解析失败，尝试不带时区的格式
            try {
                // 尝试解析不带时区的 ISO 格式（如：2025-12-05T00:00:00 或 2025-12-05T00:00:00.000）
                return LocalDateTime.parse(dateTimeStr, DateTimeFormatter.ISO_LOCAL_DATE_TIME);
            } catch (DateTimeParseException e2) {
                // 尝试其他常见格式
                try {
                    return LocalDateTime.parse(dateTimeStr, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
                } catch (DateTimeParseException e3) {
                    log.error("所有时间格式解析失败: {}", dateTimeStr, e3);
                    throw new IOException("无法解析时间字符串: " + dateTimeStr, e3);
                }
            }
        }
    }
}

