package it.unibz.inf.ontop.injection;

import it.unibz.inf.ontop.injection.impl.OntopMappingSQLAllConfigurationImpl;
import org.apache.commons.rdf.api.Graph;

import javax.annotation.Nonnull;
import java.io.File;
import java.io.Reader;

/**
 * TODO: find a better name
 */
public interface OntopMappingSQLAllConfiguration extends OntopMappingSQLConfiguration {

    @Override
    OntopMappingSQLAllSettings getSettings();

    static Builder<? extends Builder<?>> defaultBuilder() {
        return new OntopMappingSQLAllConfigurationImpl.BuilderImpl<>();
    }

    interface OntopMappingSQLAllBuilderFragment<B extends Builder<B>> {

        B nativeOntopMappingFile(@Nonnull File mappingFile);

        B nativeOntopMappingFile(@Nonnull String mappingFilename);

        B nativeOntopMappingReader(@Nonnull Reader mappingReader);

        B r2rmlMappingFile(@Nonnull File mappingFile);

        B r2rmlMappingFile(@Nonnull String mappingFilename);

        B r2rmlMappingReader(@Nonnull Reader mappingReader);

        B r2rmlMappingGraph(@Nonnull Graph rdfGraph);

        B basicImplicitConstraintFile(@Nonnull File constraintFile);

        B basicImplicitConstraintFile(@Nonnull String constraintFilename);

        B dbMetadataFile(@Nonnull File dbMetadataFile);

        B dbMetadataFile(@Nonnull String dbMetadataFilename);

        B dbMetadataReader(@Nonnull Reader dbMetadataReader);

        B lensesFile(@Nonnull File ontopViewFile);

        @Deprecated
        default B ontopViewFile(@Nonnull String lensesFilename) {
            return lensesFile(lensesFilename);
        }

        B lensesFile(@Nonnull String lensesFilename);

        @Deprecated
        default B ontopViewReader(@Nonnull Reader lensesReader) {
            return lensesReader(lensesReader);
        }

        B lensesReader(@Nonnull Reader lensesReader);
    }

    interface Builder<B extends Builder<B>> extends OntopMappingSQLConfiguration.Builder<B>,
            OntopMappingSQLAllBuilderFragment<B> {

        @Override
        OntopMappingSQLAllConfiguration build();
    }
}
