/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements. See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You 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.apache.activemq.artemis.openwire.example;

import org.apache.activemq.ActiveMQConnectionFactory;

public class Chat implements javax.jms.MessageListener {

   private static final String APP_TOPIC = "jms.samples.chat";
   private static final String DEFAULT_USER = "Chatter";
   private static final String DEFAULT_BROKER_NAME = "tcp://localhost:61616";
   private static final String DEFAULT_PASSWORD = "password";

   private javax.jms.Connection connect = null;
   private javax.jms.Session pubSession = null;
   private javax.jms.Session subSession = null;
   private javax.jms.MessageProducer publisher = null;

   /**
    * Create JMS client for publishing and subscribing to messages.
    */
   private void chatter(String broker, String username, String password) {
      // Create a connection.
      try {
         javax.jms.ConnectionFactory factory;
         factory = new ActiveMQConnectionFactory(username, password, broker);
         connect = factory.createConnection(username, password);
         pubSession = connect.createSession(false, javax.jms.Session.AUTO_ACKNOWLEDGE);
         subSession = connect.createSession(false, javax.jms.Session.AUTO_ACKNOWLEDGE);
      }
      catch (javax.jms.JMSException jmse) {
         System.err.println("error: Cannot connect to Broker - " + broker);
         jmse.printStackTrace();
         System.exit(1);
      }

      // Create Publisher and Subscriber to 'chat' topics
      try {
         javax.jms.Topic topic = pubSession.createTopic(APP_TOPIC);
         javax.jms.MessageConsumer subscriber = subSession.createConsumer(topic);
         subscriber.setMessageListener(this);
         publisher = pubSession.createProducer(topic);
         // Now that setup is complete, start the Connection
         connect.start();
      }
      catch (javax.jms.JMSException jmse) {
         jmse.printStackTrace();
      }

      try {
         // Read all standard input and send it as a message.
         java.io.BufferedReader stdin = new java.io.BufferedReader(new java.io.InputStreamReader(System.in));
         System.out.println("\nChat application:\n" + "=================\n" + "The application user " + username + " connects to the broker at " + DEFAULT_BROKER_NAME + ".\n" + "The application will publish messages to the " + APP_TOPIC + " topic.\n" + "The application also subscribes to that topic to consume any messages published there.\n\n" + "Type some text, and then press Enter to publish it as a TextMesssage from " + username + ".\n");
         while (true) {
            String s = stdin.readLine();

            if (s == null)
               exit();
            else if (s.length() > 0) {
               javax.jms.TextMessage msg = pubSession.createTextMessage();
               msg.setText(username + ": " + s);
               publisher.send(msg);
            }
         }
      }
      catch (java.io.IOException ioe) {
         ioe.printStackTrace();
      }
      catch (javax.jms.JMSException jmse) {
         jmse.printStackTrace();
      }
   }

   /**
    * Handle the message
    * (as specified in the javax.jms.MessageListener interface).
    */
   public void onMessage(javax.jms.Message aMessage) {
      try {
         // Cast the message as a text message.
         javax.jms.TextMessage textMessage = (javax.jms.TextMessage) aMessage;

         // This handler reads a single String from the
         // message and prints it to the standard output.
         try {
            String string = textMessage.getText();
            System.out.println(string);
         }
         catch (javax.jms.JMSException jmse) {
            jmse.printStackTrace();
         }
      }
      catch (java.lang.RuntimeException rte) {
         rte.printStackTrace();
      }
   }

   /**
    * Cleanup resources and then exit.
    */
   private void exit() {
      try {
         connect.close();
      }
      catch (javax.jms.JMSException jmse) {
         jmse.printStackTrace();
      }

      System.exit(0);
   }

   //
   // NOTE: the remainder of this sample deals with reading arguments
   // and does not utilize any JMS classes or code.
   //

   /**
    * Main program entry point.
    */
   public static void main(String[] argv) {
      // Is there anything to do?
      if (argv.length == 0) {
         printUsage();
         System.exit(1);
      }

      // Values to be read from parameters
      String broker = DEFAULT_BROKER_NAME;
      String username = null;
      String password = DEFAULT_PASSWORD;

      // Check parameters
      for (int i = 0; i < argv.length; i++) {
         String arg = argv[i];
         System.out.println("args::" + arg);

         if (arg.equals("-b")) {
            if (i == argv.length - 1 || argv[i + 1].startsWith("-")) {
               System.err.println("error: missing broker name:port");
               System.exit(1);
            }
            broker = argv[++i];
            continue;
         }

         if (arg.equals("-u")) {
            if (i == argv.length - 1 || argv[i + 1].startsWith("-")) {
               System.err.println("error: missing user name");
               System.exit(1);
            }
            username = argv[++i];
            continue;
         }

         if (arg.equals("-p")) {
            if (i == argv.length - 1 || argv[i + 1].startsWith("-")) {
               System.err.println("error: missing password");
               System.exit(1);
            }
            password = argv[++i];
            continue;
         }

         if (arg.equals("-h")) {
            printUsage();
            System.exit(1);
         }

         // Invalid argument
         System.err.println("error: unexpected argument: " + arg);
         printUsage();
         System.exit(1);
      }

      // Check values read in.
      if (username == null) {
         System.err.println("error: user name must be supplied");
         printUsage();
         System.exit(1);
      }

      // Start the JMS client for the "chat".
      Chat chat = new Chat();
      chat.chatter(broker, username, password);

   }

   /**
    * Prints the usage.
    */
   private static void printUsage() {

      StringBuffer use = new StringBuffer();
      use.append("usage: java Chat (options) ...\n\n");
      use.append("options:\n");
      use.append("  -b name:port Specify name:port of broker.\n");
      use.append("               Default broker: " + DEFAULT_BROKER_NAME + "\n");
      use.append("  -u name      Specify unique user name. (Required)\n");
      use.append("  -p password  Specify password for user.\n");
      use.append("               Default password: " + DEFAULT_PASSWORD + "\n");
      use.append("  -h           This help screen.\n");
      System.err.println(use);
   }

}

