/*
 * 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.commons.mime.internal;

import java.io.IOException;
import java.io.PrintWriter;
import java.net.URL;
import java.util.HashSet;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.TreeMap;

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

import org.apache.sling.commons.mime.MimeTypeService;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Reference;

@Component(
        service = Servlet.class,
        property = {
                "felix.webconsole.label=" + MimeTypeWebConsolePlugin.LABEL,
                "felix.webconsole.title=" + MimeTypeWebConsolePlugin.TITLE,
                "felix.webconsole.category=Sling",
                "felix.webconsole.css=" + MimeTypeWebConsolePlugin.CSS_REFS
        }
        )
class MimeTypeWebConsolePlugin extends HttpServlet {

    /** Serial Version */
    private static final long serialVersionUID = -2025952303202431607L;

    static final String LABEL = "mimetypes";

    static final String TITLE = "MIME Types";

    static final String RES_LOC = LABEL + "/res";

    static final String CSS_REFS = RES_LOC + "/jquery.treeTable.css";

    @Reference
    private MimeTypeService mimeTypeService;

    @Override
    protected void doGet(HttpServletRequest request,
            HttpServletResponse response) throws IOException {

        Map<String, Set<String>> mimetab = new TreeMap<String, Set<String>>();

        Map<String, String> extMap = mimeTypeService.getExtensionMap();

        int numExt = 0;
        for (Entry<String, String> entry : mimeTypeService.getMimeMap().entrySet()) {
            String ext = entry.getKey();
            String mime = entry.getValue();

            Set<String> extList = mimetab.get(mime);
            if (extList == null) {
                extList = new HashSet<String>();
                mimetab.put(mime, extList);
            }

            if (ext.equals(extMap.get(mime))) {
                ext = "*" + ext + "*";
            }

            extList.add(ext);

            numExt++;
        }

        PrintWriter pw = response.getWriter();

        pw.println("<script type='text/javascript' src='" + RES_LOC
            + "/jquery.treeTable.min.js'></script>");
        pw.println("<script type='text/javascript'>");
        pw.println("  $(document).ready(function()  {");
        pw.println("    $('#mimetabtable').treeTable({ treeColumn: 1 });");
        pw.println("  });");
        pw.println("</script>");

        pw.println("<div id='plugin_content'>");
        pw.println("<div class='fullwidth'>");
        pw.println("<div class='statusline'>Statistic: " + mimetab.size()
            + " MIME Types, " + numExt + " Extensions</div>");
        pw.println("</div>");

        pw.println("<div class='table'>");
        pw.println("<table id='mimetabtable' class='tablelayout'>");

        pw.println("<colgroup>");
        pw.println("<col width='20px'>");
        pw.println("<col width='50%'>");
        pw.println("<col width='50%'>");
        pw.println("</colgroup>");

        pw.println("<thead>");
        pw.println("<tr>");
        pw.println("<th colspan='2'>Mime Type</th>");
        pw.println("<th>Extensions</th>");
        pw.println("</tr>");
        pw.println("</thead>");

        pw.println("<tbody>");

        String currentMajor = null;

        for (Entry<String, Set<String>> entry : mimetab.entrySet()) {
            String major = getMajorType(entry.getKey());

            if (!major.equals(currentMajor)) {
                currentMajor = major;
                pw.println("<tr id='" + currentMajor + "'>");
                pw.println("<td>&nbsp;</td>");
                pw.println("<td>" + currentMajor + "</td>");
                pw.println("<td>--</td>");
                pw.println("</tr>");
            }

            pw.println("<tr id='" + entry.getKey().replace('/', '-')
                + "' class='child-of-" + currentMajor + "'>");
            pw.println("<td>&nbsp;</td>");
            pw.println("<td>" + entry.getKey() + "</td>");
            pw.println("<td>" + entry.getValue() + "</td>");
            pw.println("</tr>");
        }

        pw.println("</tbody>");
        pw.println("</table>");
        pw.println("</div>");
        pw.println("</div>");
    }

    private String getMajorType(String type) {
        int slash = type.indexOf('/');
        return (slash > 0) ? type.substring(0, slash) : type;
    }

    /**
     * Resource Provider method for the Web Console 2 integration
     * @param resourcePath
     * @return
     */
    @SuppressWarnings("unused")
    private URL getResource(final String resourcePath) {

        final int rPi = resourcePath.indexOf("/res/");
        if (rPi >= 0) {
            final String path = resourcePath.substring(rPi);
            return getClass().getResource(path);
        }

        return null;
    }

}
