/*
 * $Id$
 *
 * Copyright 1996-2008 Sun Microsystems, Inc.  All Rights Reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This code is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 only, as
 * published by the Free Software Foundation.  Sun designates this
 * particular file as subject to the "Classpath" exception as provided
 * by Sun in the LICENSE file that accompanied this code.
 *
 * This code is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * version 2 for more details (a copy is included in the LICENSE file that
 * accompanied this code).
 *
 * You should have received a copy of the GNU General Public License version
 * 2 along with this work; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
 * CA 95054 USA or visit www.sun.com if you need additional information or
 * have any questions.
 */
package com.sun.javatest.httpd;

import java.io.PrintWriter;
import java.text.DateFormat;
import java.util.Date;
import java.util.Dictionary;
import java.util.Enumeration;
import java.util.TimeZone;

import com.sun.javatest.util.I18NResourceBundle;

/**
 * Utility methods to make it easier to generate HTTP/HTML.
 */

public class PageGenerator {
    /**
     * Generate the correct HTTP header for a sucessful request (200)
     */
    public static void generateOkHttp(PrintWriter out) {
	out.println(HTTP_OK);
	genServerHdr(out);
	out.println(HTTP_CONTENT_HTML);
	out.println();
    }

    /**
     * Generate the correct HTTP header for a bad request (400)
     */
    public static void generateBadHttp(PrintWriter out) {
	out.println(HTTP_BAD);
	genServerHdr(out);
	out.println(HTTP_CONTENT_HTML);
    }

    /**
     * Generate the content type header line.
     *
     * @param version The HTML spec. version you wish to use.
     */
    public static void generateDocType(PrintWriter out, int version) {
	switch (version) {
	    case HTML32: out.println(HTML32_ID); break;
	    case HTML40_TRANS: out.println(HTML40_TRANS_ID); break;
	}
    }

    /**
     * Creates a plain header, with only a title.
     */
    public static void writeHeader(PrintWriter out, String title) {
	out.println ("<Head>");
	out.print ("<Title>");
	out.print (title);
	out.println ("</Title>");
	out.println ("</Head>");
    }

    public static void writeBeginDoc(PrintWriter out) {
	out.println("<html>");
    }

    /**
     * Writes the address info
     */
    public static void writeEndDoc(PrintWriter out) {
	out.println("</html>");
    }

    public static void startBody(PrintWriter out) {
	out.println("<Body>");
    }

    public static void endBody(PrintWriter out) {
	out.println("</Body>");
    }

    /**
     * Writes the address block and other info at the end of the body.
     */
    public static void writeFooter(PrintWriter out) {
        out.println(dateFormat.format(new Date()));
	out.println("<Address>");

	out.print(i18n.getString("generator.produced.txt"));
	out.print(swName);
	out.print(" ");
	out.println(swVersion);

	out.print(i18n.getString("generator.built.txt"));
	out.println(swBuildDate);
	out.println("</Address>");
    }

    /**
     * Prints the contents of any dictionary in a two column table.
     */
    public static void writeDictionary(PrintWriter out, Dictionary dict,
				       String keyHeader, String valHeader) {
	// XXX should include HTML filtering of strings

	if (keyHeader == null) keyHeader = "Key";
	if (valHeader == null) valHeader = "Value";
	
	out.println("<Table Border>");

	StringBuffer buf = new StringBuffer(50);

	// write the table header
	buf.append("<tr><th>");
	buf.append(keyHeader);
	buf.append("<th>");
	buf.append(valHeader);
	buf.append("</tr>");
	out.println(buf.toString());

	if (dict == null || dict.size() == 0) {
	    // no values to write, fill the space
	    buf.setLength(0);
	    buf.append("<tr><td colspan=2>");
	    buf.append("-EMPTY-");
	    buf.append("</tr>");
	}
	else {
	    Enumeration keys = dict.keys();
	    while (keys.hasMoreElements()) {
		Object key = keys.nextElement();
		out.println("<tr>");
		buf.setLength(0);
		buf.append("<td>");
		buf.append(key.toString());
		buf.append("<td>");
		buf.append((dict.get(key)).toString());
		out.println(buf.toString());
		out.println("</tr>");
	    }   // while
	}

	out.println("</Table>");
    }

    public static void startTable(PrintWriter out, boolean borders) {
	out.print("<Table");
	if (borders) out.print(" Border");
	
	out.println(">");
    }

    public static void endTable(PrintWriter out) {
	out.println("</Table>");
    }

    public static String getSWBuildDate() {
	return swBuildDate;
    }

    public static String getSWName() {
	return swName;
    }

    public static String getSWVersion() {
	return swVersion;
    }

    // --- set enviroment info ---
    public static void setSWBuildDate(String date) {
	swBuildDate = date;
    }

    public static void setSWName(String name) {
	swName = name;
    }

    public static void setSWVersion(String ver) {
	swVersion = ver;
    }

// *********** PRIVATE ***************

    private static void genServerHdr(PrintWriter out) {
	if (swName != null) {
	    out.print("Server: ");
	    out.print(swName);
	    if (swVersion != null) {
		out.print("/");
		out.print(swVersion);
	    }

	    if (swBuildDate != null) {
		out.print("  built ");
		out.print(swBuildDate);
	    }
	}

	out.println();
	out.print("Date: ");
	out.println(dateFormat.format(new Date()));
    }

    private static DateFormat dateFormat;
    private static String swBuildDate;
    private static String swName;
    private static String swVersion;
    private static I18NResourceBundle i18n = I18NResourceBundle.getBundleForClass(PageGenerator.class);

    private static final String TIMEZONE = "UTC";

    public static final int HTML32 = 0;
    public static final int HTML40_TRANS = 1;

    private static final String HTML32_ID = "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2//EN\">";
    private static final String HTML40_TRANS_ID = "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">";

    private static final String HTTP_CONTENT_TYPE = "Content-Type: ";
    private static final String HTTP_OK = "HTTP/1.1 200 OK";
    private static final String HTTP_BAD = "HTTP/1.1 400 Bad Request";
    private static final String HTTP_CONTENT_HTML = HTTP_CONTENT_TYPE + "text/html";

    static {
	dateFormat = DateFormat.getDateTimeInstance(DateFormat.FULL,
                                                    DateFormat.LONG);
	dateFormat.setTimeZone(TimeZone.getTimeZone(TIMEZONE));
    }

}

