/*
 * 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.
 *
 * @deprecated since version 1.2.8 of the {@code org.apache.sling.jcr.contentparser} bundle;
 * see <a href="https://github.com/apache/sling-org-apache-sling-contentparser-api">{@code org.apache.sling.contentparser.api}</a>
 */
@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;
    }
    
}
