/******************************************************************
 * JADE - Java Agent DEvelopment Framework is a framework to develop
 * multi-agent systems in compliance with the FIPA specifications.
 * Copyright (C) 2002 TILAB S.p.A.
 *
 * This file is donated by Acklin B.V. to the JADE project.
 *
 *
 * GNU Lesser General Public License
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation,
 * version 2.1 of the License.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the
 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
 * Boston, MA  02111-1307, USA.
 * ***************************************************************/
package jade.tools.testagent;

import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
import javax.swing.border.*;

import jade.core.AID;
import jade.core.Agent;
import jade.domain.FIPANames;
import jade.domain.FIPAAgentManagement.*;
import jade.domain.FIPAAgentManagement.FIPAManagementOntology;

import jade.content.AgentAction;
import jade.content.lang.Codec;

import jade.lang.acl.*;
import jade.content.lang.sl.*;
import jade.util.Logger;


/**
 *  This can be used as test agent for sending and receiving messages to
 *  the Agentplatform and Other agents.
 *  A couple of message templates are included in the menu.
 *
 * @author     Chris van Aart - Acklin B.V., the Netherlands
 * @created    May 6, 2002
 */

public class TestAgent extends Agent {
  
  private static Logger logger = Logger.getMyLogger(TestAgent.class.getName());
  /**
   *  Constructor for the TestAgent
   */
  public TestAgent() {
    super();
  }


  /**
   *  The main program for the TestAgent class
   *
   * @param  args  The command line arguments
   */
  public static void main(String[] args) {
    String host = "cross.hq.acklin.nl";
    String argsv[] = {"-host", host, "-container", "ruurd:jade.tools.testagent.TestAgent"};
    jade.Boot3.main(argsv);
  }


  /**
   *  Gets the PlatformRequest attribute of the TestAgent object
   *
   * @return    The PlatformRequest value
   */
  public ACLMessage getPlatformRequest() {
    ACLMessage msg = new ACLMessage(ACLMessage.REQUEST);
    msg.setSender(getAID());
    msg.setEncoding("String");
    msg.setLanguage(FIPANames.ContentLanguage.FIPA_SL0);
    msg.setOntology(FIPAManagementVocabulary.NAME);
    msg.setProtocol(FIPANames.InteractionProtocol.FIPA_REQUEST);
    msg.setReplyWith("Req" + (new Date()).getTime());
    msg.setConversationId("Req" + (new Date()).getTime());
    return msg;
  }


  /**
   *  Description of the Method
   */
  public void doRegisterAMS() {

    AMSAgentDescription amsAgentDescription = new AMSAgentDescription();
    amsAgentDescription.setName(getAID());
    amsAgentDescription.setOwnership(getHap());
    amsAgentDescription.setState("ACTIVE");
    Register register = new Register();
    register.setDescription(amsAgentDescription);

    ACLMessage msg = createRequestMessage(this, this.getAMS(), register);
    itsFrame.setItsMsg(msg);
  }


  public void doRegisterDF() {

    ServiceDescription serviceDescr = new ServiceDescription();
    serviceDescr.setName("testagent");
    serviceDescr.setOwnership(getHap());
    serviceDescr.setType("jade.testagent");

    DFAgentDescription dFAgentDescription = new DFAgentDescription();
    dFAgentDescription.setName(getAID());
    dFAgentDescription.addOntologies(FIPAManagementVocabulary.NAME);
    dFAgentDescription.addLanguages(FIPANames.ContentLanguage.FIPA_SL0);
    dFAgentDescription.addServices(serviceDescr);

    Register register = new Register();
    register.setDescription(dFAgentDescription);

    ACLMessage msg = createRequestMessage(this, getDefaultDF(), register);
    itsFrame.setItsMsg(msg);
  }


  public void doDeregisterDF() {
    DFAgentDescription dFAgentDescription = new DFAgentDescription();
    dFAgentDescription.setName(getAID());
    Deregister deregister = new Deregister();
    deregister.setDescription(dFAgentDescription);

    ACLMessage msg = createRequestMessage(this, getDefaultDF(), deregister);
    itsFrame.setItsMsg(msg);
  }


  public void doDeRegisterAMS() {

    AMSAgentDescription amsAgentDescription = new AMSAgentDescription();
    amsAgentDescription.setName(getAID());
    Deregister deregister = new Deregister();
    deregister.setDescription(amsAgentDescription);

    ACLMessage msg = createRequestMessage(this, getAMS(), deregister);
    itsFrame.setItsMsg(msg);
  }


  public void doSearchAMS() {

    AMSAgentDescription amsAgentDescription = new AMSAgentDescription();
    SearchConstraints searchConstraints = new SearchConstraints();
    searchConstraints.setMaxDepth(new Long(100));
    searchConstraints.setMaxResults(new Long(100));

    Search search = new Search();
    search.setConstraints(searchConstraints);
    search.setDescription(amsAgentDescription);

    ACLMessage msg = createRequestMessage(this, getAMS(), search);
    itsFrame.setItsMsg(msg);
  }


  public void doSearchDF() {

    DFAgentDescription dFAgentDescription = new DFAgentDescription();
    SearchConstraints searchConstraints = new SearchConstraints();

    searchConstraints.setMaxDepth(new Long(100));
    searchConstraints.setMaxResults(new Long(100));

    Search search = new Search();
    search.setConstraints(searchConstraints);
    search.setDescription(dFAgentDescription);

    ACLMessage msg = createRequestMessage(this, this.getDefaultDF(), search);
    itsFrame.setItsMsg(msg);
  }


  public void doLausannePing() {
    ACLMessage msg = new ACLMessage(ACLMessage.QUERY_REF);
    msg.setSender(getAID());

    AID aclPing = new AID("acl_ping", true);
    aclPing.setName("acl_ping@beta.lausanne.agentcities.net");
    aclPing.addAddresses("http://srv02.lausanne.agentcities.net:8080/acc");
    msg.addReceiver(aclPing);
    msg.setReplyWith("Req" + (new Date()).getTime());
    msg.setConversationId("Req" + (new Date()).getTime());

    msg.setContent("ping");
    itsFrame.setItsMsg(msg);
  }


  public void doLocalPing() {
    ACLMessage msg = new ACLMessage(ACLMessage.QUERY_REF);
    msg.setSender(getAID());
    msg.addReceiver(getAID());
    msg.setReplyWith("Req" + (new Date()).getTime());
    msg.setConversationId("Req" + (new Date()).getTime());

    msg.setContent("ping");
    itsFrame.setItsMsg(msg);
  }



  /**
   *  Description of the Method
   */
  public void doHelloWorld() {
    ACLMessage msg = new ACLMessage(ACLMessage.INFORM);
    msg.setSender(getAID());
    msg.addReceiver(getAID());
    msg.setContent("Hello World!");
    msg.setLanguage("Plain English");
    msg.setOntology("World Domination");
    msg.addUserDefinedParameter("key1", "value1");
    msg.addUserDefinedParameter("key2", "value2");
    msg.addUserDefinedParameter("key3", "value3");
    itsFrame.setItsMsg(msg);
  }


  /**
   *  Description of the Method
   */
  public void doSystemOut() {
    System.out.println(itsFrame.getItsMsg());
  }


  /**
   *  exit method
   */
  public void doExit() {
    this.doDelete();
    System.exit(0);
  }


  /**
   *  Description of the Method
   */
  public void doNewMessage() {
    ACLMessage msg = new ACLMessage(ACLMessage.INFORM);
    msg.setSender(getAID());
    itsFrame.setItsMsg(msg);
  }


  /**
   *  Description of the Method
   */
  public void sendMessage() {
    ACLMessage msg = itsFrame.getItsMsg();
    itsFrame.addMessageNode("out", msg);
    send(msg);
    doNewMessage();
  }


  /**
   *  Description of the Method
   *
   * @param  msg  Description of Parameter
   */
  public void processIncomingMessage(ACLMessage msg) {
    itsFrame.addMessageNode("in", msg);
    if (pingBehaviour) {
      if (msg.getContent() == null) {
        return;
      }

      if ((msg.getPerformative() == ACLMessage.QUERY_REF) &&
        (msg.getContent().equalsIgnoreCase("ping") ||
        (msg.getContent().equalsIgnoreCase("(ping)"))
        )) {
        ACLMessage alive = msg.createReply();
        alive.setPerformative(ACLMessage.INFORM);
        alive.setSender(this.getAID());
        alive.setContent("alive");
        this.send(alive);
        itsFrame.addMessageNode("out", alive);
      }
    }
  }



  public void doReply() {
    ACLMessage msg = itsFrame.aclTreePanel.getCurrentACL();
    if (msg == null) {
      return;
    }
    ACLMessage reply = msg.createReply();
    reply.setSender(this.getAID());
    itsFrame.aclPanel.setItsMsg(reply);
  }


  /**
   *  Description of the Method
   */
  protected void setup() {
    super.setup();
    splash = new SplashScreen();
    splash.setVisible(true);
    splash.setProgress(25);
    if(logger.isLoggable(Logger.FINE))
    	logger.log(Logger.FINE,"starting up: " + this.getAID().toString());

    try {
      getContentManager().registerLanguage(new SLCodec(), FIPANames.ContentLanguage.FIPA_SL0);
      getContentManager().registerOntology(FIPAManagementOntology.getInstance(), FIPAManagementVocabulary.NAME);

    }
    catch (Exception e) {
      e.printStackTrace();
    }

    splash.setProgress(50);
    itsFrame = new TestAgentFrame(this);
    splash.setProgress(75);
    addBehaviour(new ReceiveCyclicBehaviour(this));
    splash.setProgress(100);
    splash.setVisible(false);
  }


  ACLMessage createRequestMessage(Agent sender, AID receiver, AgentAction what) {
    ACLMessage request = new ACLMessage(ACLMessage.REQUEST);
    request.setSender(sender.getAID());
    request.addReceiver(receiver);
    request.setProtocol(FIPANames.InteractionProtocol.FIPA_REQUEST);
    request.setLanguage(FIPANames.ContentLanguage.FIPA_SL0);
    request.setEncoding("String");
    request.setOntology(FIPAManagementVocabulary.NAME);
    request.setReplyWith("rw" + sender.getName() + (new Date()).getTime());
    request.setConversationId("conv" + sender.getName() + (new Date()).getTime());

    jade.content.onto.basic.Action act = new jade.content.onto.basic.Action();
    act.setActor(receiver);
    act.setAction(what);

    try {
    	getContentManager().fillContent(request, act);
    } catch (Exception e) {
    	e.printStackTrace();
	}
    return request;
  }


  

  /**
   *  Description of the Class
   *
   * @author     chris
   * @created    May 21, 2002
   */
  private class SplashScreen extends JWindow {
    /**
     *  Constructor for the SplashScreen object
     */
    public SplashScreen() {

      try {
        jbInit();
        this.setSize(400, 50);
        Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
        this.setLocation(screenSize.width / 2 - this.getSize().width / 2,
          screenSize.height / 2 - this.getSize().height / 2);
        this.setVisible(true);
        this.requestFocus();

        // paintImmediately();
        Toolkit.getDefaultToolkit().sync();
      }
      catch (Exception e) {
        e.printStackTrace();
      }
    }


    /**
     *  Sets the Progress attribute of the SplashScreen object
     *
     * @param  p  The new Progress value
     */
    public void setProgress(int p) {
      theProgressBar.setValue(p);
    }


    void jbInit() {
      this.getContentPane().setLayout(gridBagLayout1);
      this.getContentPane().setBackground(Color.white);
      this.addFocusListener(
        new java.awt.event.FocusAdapter() {
          public void focusLost(FocusEvent e) {

          }
        });
      jPanel1.setBorder(BorderFactory.createLineBorder(Color.black));
      jPanel1.setLayout(gridBagLayout2);
      jLabel1.setBackground(Color.white);
      jLabel1.setForeground(Color.blue);
      jLabel1.setOpaque(true);
      jLabel1.setHorizontalAlignment(SwingConstants.CENTER);
      jLabel1.setText("loading, please wait...");
      jLabel1.setIcon(dummyIcon);
      theProgressBar.setBackground(Color.white);
      theProgressBar.setForeground(Color.blue);
      theProgressBar.setValue(5);
      theProgressBar.setStringPainted(true);
      this.getContentPane().add(jPanel1, new GridBagConstraints(0, 0, 1, 1, 1.0, 0.0
        , GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL, new Insets(0, 0, 0, 0), 0, 0));
      jPanel1.add(jLabel1, new GridBagConstraints(0, 0, 1, 1, 1.0, 0.0
        , GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL, new Insets(0, 0, 0, 0), 0, 0));
      jPanel1.add(theProgressBar, new GridBagConstraints(0, 1, 1, 1, 1.0, 0.0
        , GridBagConstraints.SOUTHEAST, GridBagConstraints.HORIZONTAL, new Insets(2, 5, 2, 5), 0, 0));

    }


    GridBagLayout gridBagLayout1 = new GridBagLayout();
    JPanel jPanel1 = new JPanel();
    GridBagLayout gridBagLayout2 = new GridBagLayout();
    JLabel jLabel1 = new JLabel();
    JProgressBar theProgressBar = new JProgressBar();

  }


  boolean pingBehaviour = true;

  ImageIcon dummyIcon =
    new ImageIcon(this.getClass().getResource("images/dummy.gif"));

  SplashScreen splash;

  TestAgentFrame itsFrame;
}
//  ***EOF***
