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

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

import org.osgi.annotation.versioning.ProviderType;

/**
 * Generic options for content parsers. Parser implementations can extend this class to provide additional options, valid only in the
 * context of those implementations.
 */
@ProviderType
public 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"
    )));



    private String defaultPrimaryType = DEFAULT_PRIMARY_TYPE;
    private boolean detectCalendarValues;
    private Set<String> ignorePropertyNames = Collections.emptySet();
    private Set<String> ignoreResourceNames = DEFAULT_IGNORE_RESOURCE_NAMES;
    private Set<String> removePropertyNamePrefixes = DEFAULT_REMOVE_PROPERTY_NAME_PREFIXES;

    /**
     * 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 = Collections.unmodifiableSet(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 = Collections.unmodifiableSet(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 = Collections.unmodifiableSet(value);
        return this;
    }

    public Set<String> getRemovePropertyNamePrefixes() {
        return removePropertyNamePrefixes;
    }



}
