/*
 * Copyright (C) 2004-2008 Jive Software. All rights reserved.
 *
 * 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 org.jivesoftware.xmpp.workgroup.search;

import org.jivesoftware.xmpp.workgroup.Workgroup;

import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.Date;
import java.util.List;
import java.util.Locale;

/**
 * Encapsulates a transcript search result resulting from a search using the ChatSearch class.
 * Relevance is only stored to 3 significant decimal places (xx.x%).<p>
 *
 * Use {@link #getSessionID()} to get the id of the session that originated the transcript
 * contained in the result.
 *
 * @author Gaston Dombiak
 */
public class QueryResult {

    private Workgroup workgroup;
    private String sessionID;
    private Date startDate;
    private List<String> agentJIDs;
    private float relevance;

    public QueryResult(Workgroup workgroup, String sessionID, Date startDate,
            List<String> agentJIDs, float relevance) {
        this.workgroup = workgroup;
        this.sessionID = sessionID;
        this.startDate = startDate;
        this.agentJIDs = agentJIDs;
        this.relevance = Math.round(relevance * 1000.0F) / 1000.0F;;
    }

    /**
     * Returns the workgroup where the chat support took place. Using the workgroup and the
     * sessionID it's possible for an agent to retrieve the complete chat transcript.
     *
     * @return the workgroup where the chat support took place.
     */
    public Workgroup getWorkgroup() {
        return workgroup;
    }

    /**
     * Returns the id of the session that originated the chat support. Use this id for
     * getting more information about the session. See
     * {@link org.jivesoftware.xmpp.workgroup.WorkgroupIQHandler#handleIQGet(org.xmpp.packet.IQ)}.
     *
     * @return the id of the session that originated the chat support.
     */
    public String getSessionID() {
        return sessionID;
    }

    /**
     * Returns the date when the chat support started.
     *
     * @return the date when the chat support started.
     */
    public Date getStartDate() {
        return startDate;
    }

    /**
     * Returns the bare JID of the agents that were involved in the chat support. More than
     * one agent may have been involved in a chat transfer was done to another agent or a chat
     * invitation was sent to another agent.
     *
     * @return the bare JID of the agents that were involved in the chat support.
     */
    public List<String> getAgentJIDs() {
        return agentJIDs;
    }

    /**
     * Get the relevance of this query result as determined by the search engine.
     *
     * @return the relevance of this query result as determined by the search engine.
     */
    public float getRelevance() {
        return relevance;
    }

    /**
     * Returns the relevance as a percentage (no decimal places) formatted according
     * to the locale passed in.
     *
     * @param locale the locale to use to format the percentage.
     * @return the formatted percentage as a String.
     */
    public String getRelevanceAsPercentage(Locale locale) {
        NumberFormat format = DecimalFormat.getPercentInstance(locale);
        format.setMaximumFractionDigits(0);
        return format.format(relevance);
    }
}
