package com.github.aesteve.vertx.nubes.utils;

import io.vertx.core.VertxException;

import javax.xml.datatype.DatatypeConfigurationException;
import javax.xml.datatype.DatatypeFactory;
import javax.xml.datatype.XMLGregorianCalendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.TimeZone;

/**
 * Singleton pattern implementation using enums.
 * See "Effective Java" by Joshua Bloch
 *
 * @author aesteve
 */
public enum DateUtils {

  INSTANCE;

  private transient DatatypeFactory factory;

  DateUtils() {
    try {
      factory = DatatypeFactory.newInstance();
    } catch (DatatypeConfigurationException dtce) {
      throw new VertxException(dtce);
    }
  }

  public Date parseIso8601(String date) {
    XMLGregorianCalendar cal = factory.newXMLGregorianCalendar(date);
    return cal.toGregorianCalendar().getTime();
  }

  public String formatIso8601(Date date, TimeZone zone) {
    GregorianCalendar cal = new GregorianCalendar();
    cal.setTime(date);
    if (zone != null) {
      cal.setTimeZone(zone);
    }
    XMLGregorianCalendar calXml = factory.newXMLGregorianCalendar(cal);
    if (zone == null) {
      // display as UTC
      calXml = calXml.normalize();
    }
    return calXml.toXMLFormat();
  }

  public String formatIso8601(Date date) {
    return formatIso8601(date, null);
  }

}
