package org.qinan.safetyeval.client.common.jackson;

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;

import java.io.IOException;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

/**
 * 兼容前端仅传递日期(yyyy-MM-dd)的 LocalDateTime 反序列化器。
 * <p>
 * 当入参为 "yyyy-MM-dd" 时补全为当天 00:00:00；
 * 当入参为标准日期时间(如 "yyyy-MM-dd HH:mm:ss" / "yyyy-MM-dd'T'HH:mm:ss")时按原值解析。
 *
 * @Author: ltq
 * @date 2026-07-07
 */
public class DateToLocalDateTimeDeserializer extends JsonDeserializer<LocalDateTime> {

    private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd");
    private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

    @Override
    public LocalDateTime deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
        String text = p.getText();
        if (text == null || text.trim().isEmpty()) {
            return null;
        }
        String value = text.trim();
        try {
            return LocalDateTime.parse(value);
        } catch (Exception ignore) {
            // 继续尝试其它格式
        }
        try {
            return LocalDateTime.parse(value, DATE_TIME_FORMATTER);
        } catch (Exception ignore) {
            // 继续尝试日期格式
        }
        // 仅日期格式: 补全为当天 00:00:00
        return LocalDate.parse(value, DATE_FORMATTER).atStartOfDay();
    }
}
