/*
 *    Copyright (c) 2013, University of Toronto.
 * 
 *    Licensed 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 edu.toronto.cs.xml2rdf.jena;

import java.io.InputStream;
import java.util.LinkedList;
import java.util.List;

import com.hp.hpl.jena.ontology.OntModel;
import com.hp.hpl.jena.ontology.OntModelSpec;
import com.hp.hpl.jena.rdf.model.Model;
import com.hp.hpl.jena.rdf.model.ModelFactory;
import com.hp.hpl.jena.rdf.model.RDFNode;
import com.hp.hpl.jena.rdf.model.SimpleSelector;
import com.hp.hpl.jena.rdf.model.Statement;
import com.hp.hpl.jena.rdf.model.StmtIterator;
import com.hp.hpl.jena.tdb.TDBFactory;
import com.hp.hpl.jena.vocabulary.RDFS;

import edu.toronto.cs.xml2rdf.string.StringMetric;

public class JenaUtils {


    private static long varCounter = 1;

    public static Model getTDBModel(String path) {
        Model m = TDBFactory.createModel(path);
        return m;
    }

    //  public static Model getANewModel() {
    //    Model model = ModelFactory.createDefaultModel();
    //    return model;
    //  }
    public static OntModel loadOntology(InputStream is) {
        OntModel m = ModelFactory.createOntologyModel(OntModelSpec.OWL_LITE_MEM);
        m.read(is, null);
        return m;
    }

    public static List<Statement> getBestMatchingStatements(OntModel ontology, StringMetric metric, String term) {
        StmtIterator iter
                = ontology.listStatements(new SimpleSelector(null, RDFS.label, (RDFNode) null));

        double maxSimilarity = Double.MIN_VALUE;
        List<Statement> bestChoices = new LinkedList<Statement>();

        while (iter.hasNext()) {
            Statement st = iter.next();
            String objectStr = st.getObject().asLiteral().getString();

            double similarity = metric.getSimilarity(term, objectStr);

            if (similarity <= 0) {
                continue;
            }

            if (similarity > maxSimilarity) {
                maxSimilarity = similarity;
                bestChoices.clear();
            } else if (similarity == maxSimilarity) {
                bestChoices.add(st);
            }
        }

        return bestChoices;
    }

    public static synchronized String getNextSparqlVarName() {
        return "?x" + varCounter++;
    }

    public static String querify(String clause) {
        return clause.replace("\\", "\\\\").replace("\n", "\\n").replace("\"", "\\\"");
    }

    public static void main(String[] args) {
        System.out.println(querify("efficacy of platelets rich plasma (PRP \\ PRGF)"));
    }
}