package jnpf.config;

import cn.hutool.core.util.StrUtil;
import org.jetbrains.annotations.Nullable;
import org.springframework.core.convert.converter.Converter;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

public final class StringToDateConverter implements Converter<String, Date> {

    //静态初始化定义日期字符串参数列表（需要转换的）
    private static final List<String> paramList = new ArrayList<>();

    //静态初始化可能初夏你的日期格式
    private static final String param1 = "yyyy-MM";
    private static final String param2 = "yyyy-MM-dd";
    private static final String param3 = "yyyy-MM-dd HH:mm";
    private static final String param4 = "yyyy-MM-dd HH:mm:ss";
    private static final String param5 = "yyyy/MM/dd";
    private static final String param6 = "yyyyMMdd";

    //静态代码块，将日期参数加入到列表中
    static {
        paramList.add(param1);
        paramList.add(param2);
        paramList.add(param3);
        paramList.add(param4);
    }


    @Override
    public Date convert(String source) {
        if (StrUtil.isNotBlank(source)) {
            try {
                source = source.trim();   //去除首尾空格
                //正则表达式判断是哪一种格式参数
                if (source.matches("^\\d{4}-\\d{1,2}$")) {
                    return parseDate(source, paramList.get(0));
                } else if (source.matches("^\\d{4}-\\d{1,2}-\\d{1,2}$")) {
                    return parseDate(source, paramList.get(1));
                } else if (source.matches("^\\d{4}-\\d{1,2}-\\d{1,2} {1}\\d{1,2}:\\d{1,2}$")) {
                    return parseDate(source, paramList.get(2));
                } else if (source.matches("^\\d{4}-\\d{1,2}-\\d{1,2} {1}\\d{1,2}:\\d{1,2}:\\d{1,2}$")) {
                    return parseDate(source, paramList.get(3));
                } else {
                    throw new IllegalArgumentException("还未定义该种字符串转Date的日期转换格式 --> 【日期格式】：" + source);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return null;
    }

    // 自定义函数，将字符串转Date  参1：传入的日期字符串  参2：格式参数
    private Date parseDate(String source, String format) throws ParseException {
            //日期格式转换器
        DateFormat dateFormat = new SimpleDateFormat(format);
        return dateFormat.parse(source);
    }


    public static String dateFormatCheck(String data) {
        Date date = getDate(data);
        DateFormat dateFormat;
        if (date != null) {
            dateFormat = new SimpleDateFormat(param2);
            return dateFormat.format(date);
        }
        return null;
    }

    public static Date dateFormatParser(String data) {
        Date date = getDate(data);
        if (date != null) {
            return date;
        }
        return null;
    }

    @Nullable
    private static Date getDate(String data) {
        DateFormat dateFormat = new SimpleDateFormat(param5);
        Date date = null;
        try {
            date = dateFormat.parse(data);
        } catch (ParseException e) {
            dateFormat = new SimpleDateFormat(param2);
            try {
                date = dateFormat.parse(data);
            } catch (ParseException ee) {
                dateFormat = new SimpleDateFormat(param6);
                try {
                    date = dateFormat.parse(data);
                } catch (ParseException eee) {
                }
            }
        }
        return date;
    }

}
