/*******************************************************************************
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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 org.apache.ofbiz.htmlreport.sample;

import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Random;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.ofbiz.base.util.Debug;
import org.apache.ofbiz.base.util.UtilProperties;

import org.apache.ofbiz.htmlreport.AbstractReportThread;
import org.apache.ofbiz.htmlreport.InterfaceReport;

/**
 * Thread for running sample html report.
 *  
 */
public class SampleHtmlThread extends AbstractReportThread {

	public static final String COUNT_DOWN = "countdown";
	
	public static final String COUNT_UP = "countup";
	
	public static final String CONFIRM = "confirm_action";
	
	public static final String[] messageLables = new String[] {"FORMAT_DEFAULT", "FORMAT_WARNING", "FORMAT_HEADLINE", "FORMAT_NOTE", "FORMAT_OK", "FORMAT_ERROR", "FORMAT_THROWABLE"};
	
	public static final List<String> messages = Collections.unmodifiableList(Arrays.asList(messageLables));
	
	private static final String resource = "PricatUiLabels";
	
    /**
     * Constructor, creates a new HtmlImportThreat.
     * 
     */
    public SampleHtmlThread(HttpServletRequest request, HttpServletResponse response, String name) {
        super(request, response, name);
        initHtmlReport(request, response);
    }

    public String getReportUpdate() {
        return getReport().getReportUpdate();
    }

    /**
     * @see java.lang.Runnable#run()
     */
    public void run() {
        try {
            if (getName().startsWith(COUNT_DOWN)) {
            	getReport().println(UtilProperties.getMessage(resource, "START_COUNT_DOWN", getLocale()), InterfaceReport.FORMAT_HEADLINE);
            	Random random = new Random();
            	int j = 0;
            	for (int i=1000; i>0; i--) {
            		sleep(20);
            		j = random.nextInt(7);
            		if (j == 6) {
                		getReport().println(new Throwable(UtilProperties.getMessage(resource, messages.get(j), new Object[] {i}, getLocale())));
            		} else {
                		getReport().println(UtilProperties.getMessage(resource, messages.get(j), new Object[] {i}, getLocale()), j);
            		}
            	}
            	getReport().println(UtilProperties.getMessage(resource, "COUNT_COMPLETED", getLocale()), InterfaceReport.FORMAT_HEADLINE);
            } else if (getName().startsWith(COUNT_UP)) {
            	getReport().println(UtilProperties.getMessage(resource, "START_COUNT_UP", getLocale()), InterfaceReport.FORMAT_HEADLINE);
            	Random random = new Random();
            	int j = 0;
            	for (int i=1; i<=1000; i++) {
            		sleep(20);
            		j = random.nextInt(7);
            		if (j == 6) {
                		getReport().println(new Throwable(UtilProperties.getMessage(resource, messages.get(j), new Object[] {i}, getLocale())));
            		} else {
                		getReport().println(UtilProperties.getMessage(resource, messages.get(j), new Object[] {i}, getLocale()), j);
            		}
            	}
            	getReport().println(UtilProperties.getMessage(resource, "COUNT_COMPLETED", getLocale()), InterfaceReport.FORMAT_HEADLINE);
        	} else {
            	getReport().println(getName(), InterfaceReport.FORMAT_ERROR);
            }
        } catch (Exception e) {
            getReport().println(e);
            if (Debug.errorOn()) {
                Debug.log(e);
            }
        }
    }
}
