/*
 * 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.rya.indexing.smarturi.duplication;

import org.apache.rya.indexing.smarturi.SmartUriException;
import org.openrdf.model.URI;

/**
 * Interface for detecting if two objects of type {@code T} are considered
 * approximately equal to each other.
 * @param <T> the type of object the implementation of
 * {@link ApproxEqualsDetector} handles.
 */
public interface ApproxEqualsDetector<T> {
    /**
     * Checks if two objects are approximately equal.
     * @param lhs the left hand side object.
     * @param rhs the right hand side object.
     * @return {@code true} if the two objects are considered approximately
     * equals. {@code false} otherwise.
     */
    public boolean areObjectsApproxEquals(final T lhs, final T rhs);

    /**
     * @return the default tolerance for the type.
     */
    public Tolerance getDefaultTolerance();

    /**
     * Converts a string representation of the object into the object
     * represented by the class {@link #getTypeClass()}.
     * @param string the {@link String} to convert to an object.
     * @return the object.
     * @throws SmartUriException
     */
    public T convertStringToObject(final String string) throws SmartUriException;

    /**
     * @return the object {@link Class} this detector is used for.
     */
    public Class<?> getTypeClass();

    /**
     * @return the {@link URI} for the XML schema type this detector is used
     * for.
     */
    public URI getXmlSchemaUri();

    /**
     * Checks if two string representations of objects are approximately equal.
     * @param lhs the left hand side string object representation.
     * @param rhs the right hand side string object representation.
     * @return {@code true} if the two string object representations are
     * considered approximately equals. {@code false} otherwise.
     * @throws SmartUriException
     */
    public default boolean areApproxEquals(final String lhs, final String rhs) throws SmartUriException {
        final T object1 = convertStringToObject(lhs);
        final T object2 = convertStringToObject(rhs);
        return areObjectsApproxEquals(object1, object2);
    }
}