/**
 * $Revision$
 * $Date$
 *
 * Copyright 2003-2007 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.smackx.workgroup.packet;

import org.jivesoftware.smack.packet.PacketExtension;
import org.jivesoftware.smack.provider.PacketExtensionProvider;
import org.xmlpull.v1.XmlPullParser;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;

/**
 * Agent status packet.
 *
 * @author Matt Tucker
 */
public class AgentStatus implements PacketExtension {

    private static final SimpleDateFormat UTC_FORMAT = new SimpleDateFormat("yyyyMMdd'T'HH:mm:ss");

    static {
        UTC_FORMAT.setTimeZone(TimeZone.getTimeZone("GMT+0"));
    }

    /**
     * Element name of the packet extension.
     */
    public static final String ELEMENT_NAME = "agent-status";

    /**
     * Namespace of the packet extension.
     */
    public static final String NAMESPACE = "http://jabber.org/protocol/workgroup";

    private String workgroupJID;
    private List<ChatInfo> currentChats = new ArrayList<ChatInfo>();
    private int maxChats = -1;

    AgentStatus() {
    }

    public String getWorkgroupJID() {
        return workgroupJID;
    }

    /**
     * Returns a collection of ChatInfo where each ChatInfo represents a Chat where this agent
     * is participating.
     *
     * @return a collection of ChatInfo where each ChatInfo represents a Chat where this agent
     *         is participating.
     */
    public List<ChatInfo> getCurrentChats() {
        return Collections.unmodifiableList(currentChats);
    }

    public int getMaxChats() {
        return maxChats;
    }

    public String getElementName() {
        return ELEMENT_NAME;
    }

    public String getNamespace() {
        return NAMESPACE;
    }

    public String toXML() {
        StringBuilder buf = new StringBuilder();

        buf.append("<").append(ELEMENT_NAME).append(" xmlns=\"").append(NAMESPACE).append("\"");
        if (workgroupJID != null) {
            buf.append(" jid=\"").append(workgroupJID).append("\"");
        }
        buf.append(">");
        if (maxChats != -1) {
            buf.append("<max-chats>").append(maxChats).append("</max-chats>");
        }
        if (!currentChats.isEmpty()) {
            buf.append("<current-chats xmlns= \"http://jivesoftware.com/protocol/workgroup\">");
            for (Iterator<ChatInfo> it = currentChats.iterator(); it.hasNext();) {
                buf.append(((ChatInfo)it.next()).toXML());
            }
            buf.append("</current-chats>");
        }
        buf.append("</").append(this.getElementName()).append("> ");

        return buf.toString();
    }

    /**
     * Represents information about a Chat where this Agent is participating.
     *
     * @author Gaston Dombiak
     */
    public static class ChatInfo {

        private String sessionID;
        private String userID;
        private Date date;
        private String email;
        private String username;
        private String question;

        public ChatInfo(String sessionID, String userID, Date date, String email, String username, String question) {
            this.sessionID = sessionID;
            this.userID = userID;
            this.date = date;
            this.email = email;
            this.username = username;
            this.question = question;
        }

        /**
         * Returns the sessionID associated to this chat. Each chat will have a unique sessionID
         * that could be used for retrieving the whole transcript of the conversation.
         *
         * @return the sessionID associated to this chat.
         */
        public String getSessionID() {
            return sessionID;
        }

        /**
         * Returns the user unique identification of the user that made the initial request and
         * for which this chat was generated. If the user joined using an anonymous connection
         * then the userID will be the value of the ID attribute of the USER element. Otherwise,
         * the userID will be the bare JID of the user that made the request.
         *
         * @return the user unique identification of the user that made the initial request.
         */
        public String getUserID() {
            return userID;
        }

        /**
         * Returns the date when this agent joined the chat.
         *
         * @return the date when this agent joined the chat.
         */
        public Date getDate() {
            return date;
        }

        /**
         * Returns the email address associated with the user.
         *
         * @return the email address associated with the user.
         */
        public String getEmail() {
            return email;
        }

        /**
         * Returns the username(nickname) associated with the user.
         *
         * @return the username associated with the user.
         */
        public String getUsername() {
            return username;
        }

        /**
         * Returns the question the user asked.
         *
         * @return the question the user asked, if any.
         */
        public String getQuestion() {
            return question;
        }

        public String toXML() {
            StringBuilder buf = new StringBuilder();

            buf.append("<chat ");
            if (sessionID != null) {
                buf.append(" sessionID=\"").append(sessionID).append("\"");
            }
            if (userID != null) {
                buf.append(" userID=\"").append(userID).append("\"");
            }
            if (date != null) {
                buf.append(" startTime=\"").append(UTC_FORMAT.format(date)).append("\"");
            }
            if (email != null) {
                buf.append(" email=\"").append(email).append("\"");
            }
            if (username != null) {
                buf.append(" username=\"").append(username).append("\"");
            }
            if (question != null) {
                buf.append(" question=\"").append(question).append("\"");
            }
            buf.append("/>");

            return buf.toString();
        }
    }

    /**
     * Packet extension provider for AgentStatus packets.
     */
    public static class Provider implements PacketExtensionProvider {

        public PacketExtension parseExtension(XmlPullParser parser) throws Exception {
            AgentStatus agentStatus = new AgentStatus();

            agentStatus.workgroupJID = parser.getAttributeValue("", "jid");

            boolean done = false;
            while (!done) {
                int eventType = parser.next();

                if (eventType == XmlPullParser.START_TAG) {
                    if ("chat".equals(parser.getName())) {
                        agentStatus.currentChats.add(parseChatInfo(parser));
                    }
                    else if ("max-chats".equals(parser.getName())) {
                        agentStatus.maxChats = Integer.parseInt(parser.nextText());
                    }
                }
                else if (eventType == XmlPullParser.END_TAG &&
                    ELEMENT_NAME.equals(parser.getName())) {
                    done = true;
                }
            }
            return agentStatus;
        }

        private ChatInfo parseChatInfo(XmlPullParser parser) {

            String sessionID = parser.getAttributeValue("", "sessionID");
            String userID = parser.getAttributeValue("", "userID");
            Date date = null;
            try {
                date = UTC_FORMAT.parse(parser.getAttributeValue("", "startTime"));
            }
            catch (ParseException e) {
            }

            String email = parser.getAttributeValue("", "email");
            String username = parser.getAttributeValue("", "username");
            String question = parser.getAttributeValue("", "question");

            return new ChatInfo(sessionID, userID, date, email, username, question);
        }
    }
}