package com.bonus.framework.config.deserializer;

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.google.common.collect.Maps;
import org.apache.commons.lang3.StringUtils;

import java.io.IOException;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.Iterator;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class DateDeserializer extends JsonDeserializer<LocalDate> {
   public static final String YYYY_MM_DD = "yyyy$1MM$2dd$3";
   public static final String YYYY_MM = "yyyy$1MM$2";
   public static final String MM_DD = "MM$1dd$2";
   public static final String YYYY = "yyyy$1";
   private static final Map<String, Pattern> patternMap = Maps.newLinkedHashMap();

   public static void main(String[] args) {
      System.out.println(getPattern("2014/10/10"));
      System.out.println(getPattern("2014-10-10"));
      System.out.println(getPattern("2014-10"));
      System.out.println(getPattern("2014"));
   }

   public static String getPattern(String dateString) {
      Iterator var1 = patternMap.entrySet().iterator();

      while(var1.hasNext()) {
         Map.Entry<String, Pattern> entry = (Map.Entry)var1.next();
         Matcher matcher = ((Pattern)entry.getValue()).matcher(dateString);
         if (matcher.find()) {
            if ("yyyy$1MM$2dd$3".equals(entry.getKey())) {
               return "yyyy$1MM$2dd$3".replace("$1", matcher.group(1)).replace("$2", matcher.group(2)).replace("$3", matcher.group(3));
            }

            if ("yyyy$1MM$2".equals(entry.getKey())) {
               return "yyyy$1MM$2".replace("$1", matcher.group(1)).replace("$2", matcher.group(2));
            }

            if ("MM$1dd$2".equals(entry.getKey())) {
               return "MM$1dd$2".replace("$1", matcher.group(1)).replace("$2", matcher.group(2));
            }

            if ("yyyy$1".equals(entry.getKey())) {
               return "yyyy$1".replace("$1", matcher.group(1));
            }
         }
      }

      return null;
   }

   @Override
   public LocalDate deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
      if (StringUtils.isBlank(p.getText())) {
         return null;
      } else {
         String pattern = getPattern(p.getText());
         if (pattern == null) {
            throw new RuntimeException("不支持的日期格式:" + p.getText());
         } else {
            return LocalDate.parse(p.getText(), DateTimeFormatter.ofPattern(pattern));
         }
      }
   }

   static {
      patternMap.put("yyyy$1MM$2dd$3", Pattern.compile("^\\d{4}(\\D+)\\d{1,2}(\\D+)\\d{1,2}(\\D?)$"));
      patternMap.put("yyyy$1MM$2", Pattern.compile("^\\d{4}(\\D+)\\d{1,2}(\\D?)$"));
      patternMap.put("MM$1dd$2", Pattern.compile("^\\d{1,2}(\\D+)\\d{1,2}(\\D?)$"));
      patternMap.put("yyyy$1", Pattern.compile("^\\d{4}(\\D?)$"));
   }
}
