package tsp.application;


import java.util.*;

public class SearchEngine {

    //...

    private double[] getTFIDFVector(Document document, String[] words){
        double[] res = new double[words.length];
        for (int i = 0; i < words.length; i++){
            res[i] = getTFIDF(words[i], document);
        }
        return res;
    }

    private String[] getWordsQuery(Document query){
        String[] words = query.preprocess();
        HashSet<String> uniqueWords = new HashSet<>();
        for (int i = 0; i < words.length; i++){
            if (this.getIDF(words[i]) > 1e-4){
                uniqueWords.add(words[i]);
            }
        }
        String[] uniqueWordsArray = uniqueWords.toArray(new String[uniqueWords.size()]);
        Arrays.sort(uniqueWordsArray);
        return uniqueWordsArray;
    }

    private Document[] getRelevantDocuments(String[] words){
        HashSet<Document> relevantDocuments = new HashSet<>();
        for (int i = 0; i < words.length; i++){
            if (inverseIndex.containsKey(words[i])){
                for (Document document: inverseIndex.get(words[i])){
                    relevantDocuments.add(document);
                }
            }
        }
        return relevantDocuments.toArray(new Document[relevantDocuments.size()]);
    }

    public Document search(Document query){
        String[] words = this.getWordsQuery(query);
        Document[] relevantDocuments = this.getRelevantDocuments(words);
        double[] scores = new double[relevantDocuments.length];
        for (int i = 0; i < scores.length; i++){
            double[] vector = this.getTFIDFVector(relevantDocuments[i], words);
            scores[i] = 0;
            for (int j = 0; j < vector.length; j++) scores[i] += vector[j];
        }
        int maxiIndex = 0;
        double maxiScore = -1;
        for (int i = 0; i < scores.length; i++){
            if (scores[i]> maxiScore){
                maxiIndex = i;
                maxiScore = scores[i];
            }
        }
        return relevantDocuments[maxiIndex];
    }


}
