/*
 * 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.jcr.contentparser;

import java.util.Arrays;
import java.util.Collections;
import java.util.EnumSet;
import java.util.HashSet;
import java.util.Set;

import org.osgi.annotation.versioning.ProviderType;

/**
 * Options for content parser.
 */
@ProviderType
public final class ParserOptions {
    
    /**
     * Default primary type.
     */
    public static final String DEFAULT_PRIMARY_TYPE = "nt:unstructured";

    /**
     * Default list of prefixes to remove from property names.
     */
    public static final Set<String> DEFAULT_REMOVE_PROPERTY_NAME_PREFIXES
        = Collections.unmodifiableSet(new HashSet<>(Arrays.asList(
            "jcr:reference:",
            "jcr:path:",
            "jcr:name:",
            "jcr:uri:"
          )));
    
    /**
     * Default list of resource names that should be ignored.
     */
    public static final Set<String> DEFAULT_IGNORE_RESOURCE_NAMES
        = Collections.unmodifiableSet(new HashSet<>(Arrays.asList(
            "security:acl",
            "security:principals"
          )));
    
    /**
     * List of JSON parser features activated by default.
     */
    public static final EnumSet<JsonParserFeature> DEFAULT_JSON_PARSER_FEATURES
        = EnumSet.of(JsonParserFeature.COMMENTS);
    
    private String defaultPrimaryType = DEFAULT_PRIMARY_TYPE;
    private boolean detectCalendarValues;
    private Set<String> ignorePropertyNames;
    private Set<String> ignoreResourceNames = DEFAULT_IGNORE_RESOURCE_NAMES;
    private Set<String> removePropertyNamePrefixes = DEFAULT_REMOVE_PROPERTY_NAME_PREFIXES;
    private EnumSet<JsonParserFeature> jsonParserFeatures = DEFAULT_JSON_PARSER_FEATURES;
    
    /**
     * Default "jcr:primaryType" property for resources that have no explicit value for this value.
     * If set to null, not default type is applied.
     * @param value Default primary type.
     * @return this
     */
    public ParserOptions defaultPrimaryType(String value) {
        this.defaultPrimaryType = value;
        return this;
    }
    public String getDefaultPrimaryType() {
        return defaultPrimaryType;
    }

    /**
     * Some content formats like JSON do not contain information to identify date/time values.
     * Instead they have to be detected by heuristics by trying to parse every string value.
     * This mode is disabled by default.
     * @param value Activate calendar value detection
     * @return this
     */
    public ParserOptions detectCalendarValues(boolean value) {
        this.detectCalendarValues = value;
        return this;
    }
    public boolean isDetectCalendarValues() {
        return detectCalendarValues;
    }

    /**
     * Set a list of property names that should be ignored when parsing the content file.
     * @param value List of property names 
     * @return this
     */
    public ParserOptions ignorePropertyNames(Set<String> value) {
        this.ignorePropertyNames = value;
        return this;
    }
    public Set<String> getIgnorePropertyNames() {
        return ignorePropertyNames;
    }

    /**
     * Set a list of resource/node names that should be ignored when parsing the content file.
     * @param value List of resource/node names
     * @return this
     */
    public ParserOptions ignoreResourceNames(Set<String> value) {
        this.ignoreResourceNames = value;
        return this;
    }
    public Set<String> getIgnoreResourceNames() {
        return ignoreResourceNames;
    }

    /**
     * Set a list of property name prefixes that should be removed automatically from the property name. 
     * @param value List of property name prefixes
     * @return this
     */
    public ParserOptions removePropertyNamePrefixes(Set<String> value) {
        this.removePropertyNamePrefixes = value;
        return this;
    }
    public Set<String> getRemovePropertyNamePrefixes() {
        return removePropertyNamePrefixes;
    }
    
    /**
     * Set set of features the JSON parser should apply when parsing files. 
     * @param value JSON parser features
     * @return this
     */
    public ParserOptions jsonParserFeatures(EnumSet<JsonParserFeature> value) {
        this.jsonParserFeatures = value;
        return this;
    }
    public ParserOptions jsonParserFeatures(JsonParserFeature... value) {
        this.jsonParserFeatures = EnumSet.copyOf(Arrays.asList(value));
        return this;
    }
    public EnumSet<JsonParserFeature> getJsonParserFeatures() {
        return jsonParserFeatures;
    }
    
}
