/**
 * *****************************************************************************
 * Copyright 2013 Jeremie Bresson
 *
 * 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 net.apocalypselabs.symat; // Package name changed.

import java.awt.Color;
import java.util.List;
import java.util.Map.Entry;
import syntaxhighlight.ParseResult;
import syntaxhighlight.Style;
import syntaxhighlight.Theme;

public class PrettifyToHtml {

    private static final String MAIN_CLASS = "prettyprint";

    /**
     * Format the {@link ParseResult} into an HTML file.
     *
     * @param content
     * @param parseResults
     * @return
     */
    public static String toHtml(String content, List<ParseResult> parseResults) {
        int endIndex = 0;
        StringBuilder sb = new StringBuilder();
        sb.append("<div class=\"" + MAIN_CLASS + "\">");
        sb.append("<pre>");
        for (ParseResult pr : parseResults) {
            int startIndex = pr.getOffset();
            if (startIndex > endIndex) {
                sb.append(content.substring(endIndex, startIndex));
            }
            endIndex = startIndex + pr.getLength();
            sb.append("<span class=\"" + pr.getStyleKeysString() + "\">");
            sb.append(content.substring(startIndex, endIndex));
            sb.append("</span>");
        }
        if (content.length() > endIndex) {
            sb.append(content.substring(endIndex, content.length()));
        }
        sb.append("</pre>");
        sb.append("</div>");
        return sb.toString();
    }

    public static String toCss(Theme theme) {
        StringBuilder sb = new StringBuilder();
        sb.append("." + MAIN_CLASS + "  {");
        sb.append("font-family:monospace; ");
        appendCssColor(sb, "background-color", theme.getBackground());
        sb.append("}\n");
        for (Entry<String, Style> entry : theme.getStyles().entrySet()) {
            sb.append("." + MAIN_CLASS + " ." + entry.getKey() + "  {");
            Style style = entry.getValue();
            appendCssColor(sb, "background-color", style.getBackground());
            appendCssColor(sb, "color", style.getColor());
            appendCssText(sb, "font-weight: bold", style.isBold());
            appendCssText(sb, "font-style: italic", style.isItalic());
            appendCssText(sb, "text-decoration: underline", style.isUnderline());
            sb.append("}\n");
        }
        theme.getStyles();
        return sb.toString();
    }

    private static void appendCssColor(StringBuilder sb, String cssKey, Color color) {
        if (color != null) {
            sb.append(cssKey + ": " + encode(color) + "; ");
        }
    }

    private final static String encode(Color color) {
        String s = Integer.toHexString(color.getRGB() & 0xffffff);
        if (s.length() < 6) {
            s = "000000".substring(0, 6 - s.length()) + s;
        }
        return '#' + s;
    }

    private static void appendCssText(StringBuilder sb, String cssProp, boolean isSet) {
        if (isSet) {
            sb.append(cssProp + "; ");
        }
    }
}
