/*
 * 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
 *
 *   https://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.
 *
 *   SPDX-License-Identifier: Apache-2.0
 */

package org.apache.jena.query.text.assembler;

import java.io.File ;

import org.apache.jena.query.text.TextSearchUtil ;
import org.apache.jena.rdf.model.Model ;
import org.apache.jena.rdf.model.ModelFactory ;
import org.apache.jena.rdf.model.RDFNode ;
import org.apache.jena.rdf.model.Resource ;
import org.apache.jena.tdb2.assembler.VocabTDB2;
import org.apache.jena.vocabulary.RDF ;
import org.apache.jena.vocabulary.RDFS ;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;

public abstract class AbstractTestTextAssembler {

    protected static final Model model = ModelFactory.createDefaultModel();
    private static final String TESTBASE = "http://example.org/abstractTestTextAssembler/";
    protected static final Resource SIMPLE_DATASET_SPEC;
    protected static final Resource SIMPLE_INDEX_SPEC;
    protected static final Resource SIMPLE_INDEX_SPEC2;
    protected static final Resource SIMPLE_INDEX_SPEC3;
    protected static final Resource SIMPLE_INDEX_SPEC4;
    protected static final Resource SIMPLE_INDEX_SPEC5;
    protected static final Resource SIMPLE_INDEX_SPEC_QUERY_ANALYZER;
    protected static final Resource SIMPLE_ENTITY_MAP_SPEC;
    protected static final Resource SIMPLE_INDEX_SPEC_LITERAL_DIR;
    protected static final Resource SIMPLE_INDEX_SPEC_MEM_DIR;

    static {
        SIMPLE_ENTITY_MAP_SPEC =
                model.createResource(TESTBASE + "simpleEntityMapSpec")
                     .addProperty(RDF.type, TextVocab.entityMap)
                     .addProperty(TextVocab.pEntityField, "entityField")
                     .addProperty(TextVocab.pDefaultField, "defaultField")
                     .addProperty(TextVocab.pMap,
                                  model.createList(
                                          new RDFNode[] {
                                                model.createResource()
                                                     .addProperty(TextVocab.pField, "defaultField")
                                                     .addProperty(TextVocab.pPredicate, RDFS.label)
                                          }))
                     ;
        SIMPLE_DATASET_SPEC =
                model.createResource(TESTBASE + "simpleDatasetSpec")
                     .addProperty(RDF.type, VocabTDB2.tDatasetTDB)
                     .addProperty(VocabTDB2.pLocation, "target/test/testasm/DB");

        SIMPLE_INDEX_SPEC =
                model.createResource(TESTBASE + "simpleIndexSpec")
                     .addProperty(RDF.type, TextVocab.textIndexLucene)
                     .addProperty(TextVocab.pDirectory, model.createResource("file:target/test/testasm/simpleIndexSpec"))
                     .addProperty(TextVocab.pEntityMap, SIMPLE_ENTITY_MAP_SPEC);

        SIMPLE_INDEX_SPEC2 =
                model.createResource(TESTBASE + "simpleIndexSpec2")
                     .addProperty(RDF.type, TextVocab.textIndexLucene)
                     .addProperty(TextVocab.pDirectory, model.createResource("file:target/test/testasm/simpleIndexSpec2"))
                     .addProperty(TextVocab.pEntityMap, SIMPLE_ENTITY_MAP_SPEC);

        SIMPLE_INDEX_SPEC3 =
                model.createResource(TESTBASE + "simpleIndexSpec3")
                     .addProperty(RDF.type, TextVocab.textIndexLucene)
                     .addProperty(TextVocab.pDirectory, model.createResource("file:target/test/testasm/simpleIndexSpec3"))
                     .addProperty(TextVocab.pEntityMap, SIMPLE_ENTITY_MAP_SPEC);

        SIMPLE_INDEX_SPEC4 =
                model.createResource(TESTBASE + "simpleIndexSpec4")
                     .addProperty(RDF.type, TextVocab.textIndexLucene)
                     .addProperty(TextVocab.pDirectory, model.createResource("file:target/test/testasm/simpleIndexSpec4"))
                     .addProperty(TextVocab.pEntityMap, SIMPLE_ENTITY_MAP_SPEC);

        SIMPLE_INDEX_SPEC5 =
                model.createResource(TESTBASE + "simpleIndexSpec5")
                .addProperty(RDF.type, TextVocab.textIndexLucene)
                .addProperty(TextVocab.pDirectory, model.createResource("file:target/test/testasm/simpleIndexSpec5"))
                .addProperty(TextVocab.pEntityMap, SIMPLE_ENTITY_MAP_SPEC);

        SIMPLE_INDEX_SPEC_QUERY_ANALYZER =
                model.createResource(TESTBASE + "simpleIndexSpecQueryAnalyzer")
                     .addProperty(RDF.type, TextVocab.textIndexLucene)
                     .addProperty(TextVocab.pDirectory, model.createResource("file:target/test/testasm/simpleIndexSpecQueryAnalyzer"))
                     .addProperty(TextVocab.pQueryAnalyzer,
                         model.createResource().addProperty(RDF.type, TextVocab.keywordAnalyzer)
                     )
                     .addProperty(TextVocab.pEntityMap, SIMPLE_ENTITY_MAP_SPEC);

        SIMPLE_INDEX_SPEC_LITERAL_DIR =
                model.createResource(TESTBASE + "simpleIndexLiteralDirSpec")
                     .addProperty(RDF.type, TextVocab.textIndexLucene)
                     .addProperty(TextVocab.pDirectory, model.createLiteral("target/test/testasm/simpleIndexLiteralDir"))
                     .addProperty(TextVocab.pEntityMap, SIMPLE_ENTITY_MAP_SPEC);

        SIMPLE_INDEX_SPEC_MEM_DIR =
                model.createResource(TESTBASE + "simpleIndexMemDirSpec")
                     .addProperty(RDF.type, TextVocab.textIndexLucene)
                     .addProperty(TextVocab.pDirectory, model.createLiteral("mem"))
                     .addProperty(TextVocab.pEntityMap, SIMPLE_ENTITY_MAP_SPEC);
    }

    protected void deleteFiles() {
        File indexDir;
        indexDir = new File("target/test/testasm/DB"); if (indexDir.exists()) TextSearchUtil.emptyAndDeleteDirectory(indexDir);
        indexDir = new File("target/test/testasm/simpleIndexSpec"); if (indexDir.exists()) TextSearchUtil.emptyAndDeleteDirectory(indexDir);
        indexDir = new File("target/test/testasm/simpleIndexSpec2"); if (indexDir.exists()) TextSearchUtil.emptyAndDeleteDirectory(indexDir);
        indexDir = new File("target/test/testasm/simpleIndexSpec3"); if (indexDir.exists()) TextSearchUtil.emptyAndDeleteDirectory(indexDir);
        indexDir = new File("target/test/testasm/simpleIndexSpec4"); if (indexDir.exists()) TextSearchUtil.emptyAndDeleteDirectory(indexDir);
        indexDir = new File("target/test/testasm/simpleIndexSpec5"); if (indexDir.exists()) TextSearchUtil.emptyAndDeleteDirectory(indexDir);
        indexDir = new File("target/test/testasm/simpleIndexSpecQueryAnalyzer"); if (indexDir.exists()) TextSearchUtil.emptyAndDeleteDirectory(indexDir);
        indexDir = new File("target/test/testasm/simpleIndexLiteralDir"); if (indexDir.exists()) TextSearchUtil.emptyAndDeleteDirectory(indexDir);
    }

    @BeforeEach public void before() {
        deleteFiles();

        TextSearchUtil.createEmptyIndex(new File("target/test/testasm/DB"));
    }

    @AfterEach public void after() {
        deleteFiles();
    }

}
