package com.ecep.contract.config;

import java.io.IOException;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;

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

/**
 * 自定义LocalDateTime反序列化器，支持多种格式
 */
class CustomLocalDateTimeDeserializer extends StdDeserializer<LocalDateTime> {
    private final List<DateTimeFormatter> formatters;

    public CustomLocalDateTimeDeserializer() {
        super(LocalDateTime.class);
        // 支持多种日期时间格式
        this.formatters = new ArrayList<>();
        // ISO标准格式，2011-12-03T10:15:30
        this.formatters.add(DateTimeFormatter.ISO_LOCAL_DATE_TIME);
        // 项目默认格式 yyyy-MM-dd HH:mm:ss
        this.formatters.add(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
        // 其他可能的格式
        this.formatters.add(DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss"));
        this.formatters.add(DateTimeFormatter.ofPattern("yyyy.MM.dd HH:mm:ss"));
        this.formatters.add(DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm"));
        this.formatters.add(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"));
    }

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

        // 尝试使用各种格式解析
        for (DateTimeFormatter formatter : formatters) {
            try {
                return LocalDateTime.parse(value, formatter);
            } catch (Exception e) {
                // 尝试下一种格式
                continue;
            }
        }

        // 如果所有格式都失败，尝试使用ISO_INSTANT格式（可能是时间戳字符串）
        try {
            return LocalDateTime.ofInstant(Instant.parse(value), ZoneId.systemDefault());
        } catch (Exception e) {
            // 仍然失败，抛出异常
            throw new JsonParseException(p, "无法解析为LocalDateTime: " + value);
        }
    }
}