package org.jooby;

import static java.util.Objects.requireNonNull;
import static org.junit.Assert.assertEquals;

import java.text.SimpleDateFormat;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.Date;
import java.util.TimeZone;

import javax.inject.Inject;
import javax.inject.Named;

import org.jooby.mvc.GET;
import org.jooby.mvc.Path;
import org.jooby.test.ServerFeature;
import org.junit.Test;

import com.typesafe.config.ConfigFactory;
import com.typesafe.config.ConfigValueFactory;

public class DateTimeFormatterFeature extends ServerFeature {

  public static class Resource {

    private DateTimeFormatter formatter;

    private String dateFormat;

    private ZoneId zoneId;

    @Inject
    public Resource(final DateTimeFormatter formatter, final ZoneId zoneId,
        @Named("application.dateFormat") final String dateFormat) {
      assertEquals(ZoneId.of("GMT"), zoneId);
      assertEquals(zoneId, formatter.getZone());
      this.formatter = requireNonNull(formatter, "def formatter is required.");
      this.zoneId = zoneId;
      this.dateFormat = requireNonNull(dateFormat, "The dateFormat is required.");
    }

    @GET
    @Path("/")
    public String formatter(final long time, final org.jooby.Request req) {
      Date date = new Date(time);
      SimpleDateFormat sdf = new SimpleDateFormat(dateFormat, req.locale());
      sdf.setTimeZone(TimeZone.getTimeZone(zoneId));
      String sdate = sdf.format(date);
      String newsdate = formatter.format(formatter.parse(sdate));
      return sdate + "|" + newsdate;
    }
  }

  {
    use(ConfigFactory
        .empty()
        .withValue("application.lang", ConfigValueFactory.fromAnyRef("en-US"))
        .withValue("application.dateFormat", ConfigValueFactory.fromAnyRef("MM/dd/yy H:mm"))
        .withValue("application.tz", ConfigValueFactory.fromAnyRef("GMT")));
    use(Resource.class);
  }

  @Test
  public void dateFormat() throws Exception {
    long time = 1412824189989l;
    request()
      .get("/?time=" + time)
      .expect(200)
      .expect("10/09/14 3:09|10/09/14 3:09");
  }

}
