/*
 * 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.sling.junit.impl.servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.util.Collection;

import javax.servlet.http.HttpServletResponse;

import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Service;
import org.apache.sling.junit.RendererFactory;
import org.apache.sling.junit.Renderer;
import org.apache.sling.junit.TestSelector;
import org.junit.runner.Description;
import org.junit.runner.Result;
import org.junit.runner.notification.Failure;
import org.junit.runner.notification.RunListener;

/** HTML renderer for JUnit servlet */
@Component(immediate=false)
@Service(serviceFactory=true)
public class HtmlRenderer extends RunListener implements Renderer,RendererFactory {

    public static final String EXTENSION = "html";
    private PrintWriter output;
    
    /** @inheritDoc */
    public Renderer createRenderer() { 
        return new HtmlRenderer();
    }

    /** @inheritDoc */
    public boolean appliesTo(TestSelector s) {
        // This is our default renderer, applies to the empty
        // extension as well
        return EXTENSION.equals(s.getExtension()) || "".equals(s.getExtension()); 
    }
    
    /** @inheritDoc */
    public String getExtension() {
        return EXTENSION;
    }

    /** @inheritDoc */
    public void info(String cssClass, String str) {
        output.println("<p class='" + cssClass + "'>");
        HtmlFilter.escape(output, str);
        output.println("</p>");
    }
    
    /** @inheritDoc */
    public void list(String cssClass, Collection<String> data) {
        output.println("<ul class='testNames'>");
        for(String str : data) {
            output.println("<li>");
            HtmlFilter.escape(output, str);
            output.println("</li>");
        }
        output.println("</ul>");
    }
    
    /** @inheritDoc */
    public void title(int level, String title) {
        output.print("<h" + level + ">");
        HtmlFilter.escape(output, title);
        output.print("</h" + level + ">");
    }
    
    /** @inheritDoc */
    public void link(String info, String url, String method) {
        output.println("<div class='link'>");
        
        if("POST".equalsIgnoreCase(method)) {
            output.print("<form method='POST' action='");
            output.print(url);
            output.print("'>");
            output.print("<input type='submit' value='");
            HtmlFilter.escape(output, info);
            output.print("'/>");
            output.println("</form>");
        } else {
            output.print("<a href='");
            output.print(url);
            HtmlFilter.escape(output, info);
            output.print("'>");
            output.println("</a>");
        }
        
        output.println("</div>");
    }

    /** @inheritDoc */
    public void setup(HttpServletResponse response, String pageTitle) throws IOException, UnsupportedEncodingException {
        if(output != null) {
            throw new IllegalStateException("Output Writer already set");
        }
        response.setContentType("text/html");
        response.setCharacterEncoding("UTF-8");
        output = response.getWriter();
        output.println("<html><head>");
        output.println("<link rel='stylesheet' type='text/css' href='" + JUnitServlet.CSS + "'/>");
        output.print("<title>");
        HtmlFilter.escape(output, pageTitle);
        output.println("</title>");
        output.println("</head><body><h1>");
        HtmlFilter.escape(output, pageTitle);
        output.println("</h1>");
    }
    
    /** @inheritDoc */
    public void cleanup() {
        output.println("</body>");
        output.println("</html>");
        output = null;
    }
    
    /** @inheritDoc */
    public RunListener getRunListener() {
        return this;
    }
    
    @Override
    public void testFailure(Failure failure) throws Exception {
        super.testFailure(failure);
        output.print("<div class='failure'><h3>");
        output.print("TEST FAILED: ");
        HtmlFilter.escape(output, failure.getTestHeader());
        output.print("</h3><div class='failureDetails'>");
        HtmlFilter.escape(output, failure.toString());
        output.println("</div></div>");
    }

    @Override
    public void testFinished(Description description) throws Exception {
        super.testFinished(description);
        output.print("<p class='finished'>Test finished: ");
        HtmlFilter.escape(output, description.toString());
        output.println("</p></div>");
    }

    @Override
    public void testIgnored(Description description) throws Exception {
        super.testIgnored(description);
        output.print("<p class='ignored'><h3>TEST IGNORED</h3><b>");
        HtmlFilter.escape(output, description.toString());
        output.println("</b></p>");
    }

    private void counter(String name, String cssName, int value) {
        final String cssClass = cssName + (value > 0 ? "NonZero" : "Zero");
        output.print("<span class='");
        output.print(cssClass);
        output.print("'>");
        HtmlFilter.escape(output, name);
        output.print(":");
        HtmlFilter.escape(output, String.valueOf(value));
        output.println("</span>");
    }
    
    @Override
    public void testRunFinished(Result result) throws Exception {
        super.testRunFinished(result);
        String cssClass = "testRun ";
        if(result.getFailureCount() > 0) {
            cssClass += "failure";
        } else if(result.getIgnoreCount() > 0) {
            cssClass += "ignored";
        } else {
            cssClass += "success";
        }
        
        output.println("<p class='testRun'>");
        output.print("TEST RUN FINISHED: ");
        counter("tests", "testCount", result.getRunCount());
        output.print(", ");
        counter("failures", "failureCount", result.getFailureCount());
        output.print(", ");
        counter("ignored", "ignoredCount", result.getIgnoreCount());
        output.println("</p>");
    }

    @Override
    public void testRunStarted(Description description)
            throws Exception {
        super.testRunStarted(description);
    }

    @Override
    public void testStarted(Description description) throws Exception {
        super.testStarted(description);
        output.println("<div class='test'>");
    }
}
