/*
 * Copyright 2007 Google Inc.
 * 
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License. You may obtain a copy of
 * the License at
 * 
 * http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations under
 * the License.
 */
package com.google.gwt.dev.util;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;

/**
 * HTTP header strings defined by RFCs.
 */
public final class HttpHeaders {

  public static final long MS_SEC = 1000;
  public static final long MS_MIN = MS_SEC * 60;
  public static final long MS_HR = MS_MIN * 60;
  public static final long MS_DAY = MS_HR * 24;

  public static final long SEC_MIN = 60;
  public static final long SEC_HR = SEC_MIN * 60;
  public static final long SEC_DAY = SEC_HR * 24;
  public static final long SEC_YR = SEC_DAY * 365;

  public static final String CACHE_CONTROL = "Cache-Control";
  public static final String CACHE_CONTROL_MAXAGE = "max-age=";
  public static final String CACHE_CONTROL_MUST_REVALIDATE = "must-revalidate";
  public static final String CACHE_CONTROL_NO_CACHE = "no-cache";
  public static final String CACHE_CONTROL_PRIVATE = "private";
  public static final String CACHE_CONTROL_PUBLIC = "public";

  public static final String CONTENT_ENCODING = "Content-Encoding";
  public static final String CONTENT_ENCODING_GZIP = "gzip";
  public static final String CONTENT_LENGTH = "Content-Length";
  public static final String CONTENT_TYPE = "Content-Type";
  public static final String CONTENT_TYPE_APPLICATION_XJAVASCRIPT_UTF8 = "application/x-javascript; charset=utf-8";
  public static final String CONTENT_TYPE_TEXT_CSS = "text/css";
  public static final String CONTENT_TYPE_TEXT_HTML = "text/html";
  public static final String CONTENT_TYPE_TEXT_HTML_UTF8 = "text/html; charset=utf-8";
  public static final String CONTENT_TYPE_TEXT_PLAIN = "text/plain";

  public static final String DATE = "Date";
  public static final String ETAG = "ETag";
  public static final String EXPIRES = "Expires";
  public static final String IF_MODIFIED_SINCE = "If-Modified-Since";
  public static final String IF_NONE_MATCH = "If-None-Match";
  public static final String LAST_MODIFIED = "Last-Modified";

  /**
   * The Internet date format for HTTP.
   */
  private static DateFormat sHttpDateFormat = new SimpleDateFormat(
      "EEE, d MMM yyyy HH:mm:ss", Locale.US);

  /**
   * Converts an HTTP date string into a file-style date/time.
   */
  public static long fromInternetDateFormat(String timeStr) {
    Date dateGmt;
    try {
      synchronized (sHttpDateFormat) {
        dateGmt = sHttpDateFormat.parse(timeStr);
      }
    } catch (ParseException e) {
      return 0;
    }
    dateGmt = gmtToDate(dateGmt);
    return dateGmt.getTime();
  }

  /**
   * Converts a file-style date/time into a string form that is compatible with
   * HTTP.
   */
  public static String toInternetDateFormat(long time) {
    Date date = dateToGMT(new Date(time));
    String dateGmt;
    synchronized (sHttpDateFormat) {
      dateGmt = sHttpDateFormat.format(date) + " GMT";
    }
    return dateGmt;
  }

  /**
   * Converts a local date to GMT.
   * 
   * @param date the date in the local time zone
   * @return the GMT version
   */
  private static Date dateToGMT(Date date) {
    Calendar cal = Calendar.getInstance();
    long tzMillis = cal.get(Calendar.ZONE_OFFSET)
        + cal.get(Calendar.DST_OFFSET);
    return new Date(date.getTime() - tzMillis);
  }

  /**
   * Converts a GMT into a local date.
   * 
   * @param date the date in GMT
   * @return the the local time zone version
   */
  private static Date gmtToDate(Date date) {
    Calendar cal = Calendar.getInstance();
    long tzMillis = cal.get(Calendar.ZONE_OFFSET)
        + cal.get(Calendar.DST_OFFSET);
    return new Date(date.getTime() + tzMillis);
  }
}
