// Copyright 2008 Google Inc. All rights reserved.

package com.google.appengine.demos.helloxmpp;

import com.google.appengine.api.xmpp.JID;
import com.google.appengine.api.xmpp.Message;
import com.google.appengine.api.xmpp.MessageBuilder;
import com.google.appengine.api.xmpp.MessageType;
import com.google.appengine.api.xmpp.Presence;
import com.google.appengine.api.xmpp.SendResponse;
import com.google.appengine.api.xmpp.XMPPService;
import com.google.appengine.api.xmpp.XMPPServiceFactory;

import java.io.IOException;
import java.util.Map;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * HelloXmpp is an echo bot that sends back the message it receives.
 */
public class HelloXmpp extends HttpServlet {

  private XMPPService xmppService;

  @Override
  public void init() {
    this.xmppService = XMPPServiceFactory.getXMPPService();
  }

  // For testing. Real requests are POST
  public void doGet(HttpServletRequest req, HttpServletResponse res)
      throws IOException {
    Message message =new MessageBuilder()
        .withMessageType(MessageType.CHAT)
        .withFromJid(new JID(req.getParameter("from")))
        .withRecipientJids(new JID(req.getParameter("to")))
        .withBody(req.getParameter("body"))
        .build();
    processMessage(message, res);
  }

  public void doPost(HttpServletRequest req, HttpServletResponse res)
      throws IOException {
    processMessage(xmppService.parseMessage(req), res);
  }

  public void processMessage(Message message, HttpServletResponse res) throws IOException {
    JID fromId = message.getFromJid();
    Presence presence = xmppService.getPresence(fromId);
    String presenceString = presence.isAvailable() ? "" : "not ";
    SendResponse response = xmppService.sendMessage(
        new MessageBuilder().
        withBody(message.getBody() + " (you are " + presenceString + "available)").
        withRecipientJids(fromId).
        build());

    for (Map.Entry<JID, SendResponse.Status> entry :
        response.getStatusMap().entrySet()) {
      res.getWriter().println(entry.getKey() + "," + entry.getValue() + "<br>");
    }

    res.getWriter().println("processed");
  }
}
