/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 ~ 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.scriptingbundle.plugin.processor;

import java.nio.file.Paths;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

import org.apache.sling.api.servlets.ServletResolverConstants;

public final class Constants {

    private Constants() {}

    public static final Set<String> METHODS = Collections.unmodifiableSet(new HashSet<>(Arrays.asList("TRACE", "OPTIONS", "GET", "HEAD", "POST", "PUT",
            "DELETE", "PATCH")));
    public static final String EXTENDS_FILE = "extends";
    public static final String REQUIRES_FILE = "requires";
    public static final String CAPABILITY_NS = "sling.servlet";
    public static final String CAPABILITY_RESOURCE_TYPE_AT = ServletResolverConstants.SLING_SERVLET_RESOURCE_TYPES;
    public static final String CAPABILITY_SELECTORS_AT = ServletResolverConstants.SLING_SERVLET_SELECTORS;
    public static final String CAPABILITY_EXTENSIONS_AT = ServletResolverConstants.SLING_SERVLET_EXTENSIONS;
    public static final String CAPABILITY_METHODS_AT = ServletResolverConstants.SLING_SERVLET_METHODS;
    public static final String CAPABILITY_PATH_AT = ServletResolverConstants.SLING_SERVLET_PATHS;
    public static final String CAPABILITY_VERSION_AT = aQute.bnd.osgi.Constants.VERSION_ATTRIBUTE;
    public static final String CAPABILITY_EXTENDS_AT = "extends";
    public static final String CAPABILITY_SCRIPT_ENGINE_AT = "scriptEngine";
    public static final String CAPABILITY_SCRIPT_EXTENSION_AT = "scriptExtension";

    public static final String BND_SOURCE_DIRECTORIES = "sourceDirectories";
    public static final String BND_EXCLUDES = "excludes";
    public static final String BND_INCLUDES = "includes";
    public static final String BND_SCRIPT_ENGINE_MAPPINGS = "scriptEngineMappings";
    public static final String BND_SEARCH_PATHS = "searchPaths";
    public static final String BND_MISSING_REQUIREMENTS_OPTIONAL = "missingRequirementsOptional";

    public static final String SLING_RESOURCE_SUPER_TYPE_XML_LOCAL_NAME = "resourceSuperType";
    public static final String SLING_REQUIRED_RESOURCE_TYPES = "sling:requiredResourceTypes";
    public static final String SLING_REQUIRED_RESOURCE_TYPES_XML_LOCAL_NAME = "requiredResourceTypes";

    public static final Map<String, String> DEFAULT_EXTENSION_TO_SCRIPT_ENGINE_MAPPING;
    public static final Set<String> DEFAULT_SEARCH_PATHS;
    public static final Set<String> DEFAULT_SOURCE_DIRECTORIES;
    public static final Set<String> DEFAULT_EXCLUDES = Collections.unmodifiableSet(new HashSet<>(Arrays.asList(
        // Miscellaneous typical temporary files
        "**/*~", "**/#*#", "**/.#*", "**/%*%", "**/._*",

        // CVS
        "**/CVS", "**/CVS/**", "**/.cvsignore",

        // Subversion
        "**/.svn", "**/.svn/**",

        // Bazaar
        "**/.bzr", "**/.bzr/**",

        // Mac
        "**/.DS_Store",

        // Mercurial
        "**/.hg", "**/.hg/**",

        // git
        "**/.git", "**/.git/**"
    )));

    static {
        HashMap<String, String> scriptEngineMapping = new HashMap<>();
        scriptEngineMapping.put("ftl", "freemarker");
        scriptEngineMapping.put("gst", "gstring");
        scriptEngineMapping.put("html", "htl");
        scriptEngineMapping.put("java", "java");
        scriptEngineMapping.put("esp", "rhino");
        scriptEngineMapping.put("ecma", "rhino");
        scriptEngineMapping.put("jsp", "jsp");
        scriptEngineMapping.put("jspf", "jsp");
        scriptEngineMapping.put("jspx", "jsp");
        /**
         * commented out since Thymeleaf uses the same 'html' extension like HTL
         * scriptEngineMapping.put("html", "thymeleaf");
         */
        DEFAULT_EXTENSION_TO_SCRIPT_ENGINE_MAPPING = Collections.unmodifiableMap(scriptEngineMapping);

        DEFAULT_SEARCH_PATHS = Collections.unmodifiableSet(new HashSet<>(Arrays.asList("/libs", "/apps")));
        DEFAULT_SOURCE_DIRECTORIES =
                Collections.unmodifiableSet(new HashSet<>(Arrays.asList(Paths.get("src", "main", "scripts").toString(), Paths.get("src",
                        "main", "resources", "javax.script").toString())));
    }

}
