//
// Copyright (c) ZeroC, Inc. All rights reserved. 
//

import Demo.*; 

public class Client
{
    public static void main(String[] args)
    {
        int status = 0;
        Ice. StringSeqHolder argsHolder = new Ice. StringSeqHolder(args);

        //
        // Try with resources block - communicator is automatically destroyed
        // at the end of this try block
        //
        try(Ice. Communicator communicator = Ice. Util.initialize(argsHolder, "config.client"))
        {
            if(argsHolder.value.length > 0)
            {
                System.err.println("too many arguments");
                status = 1;
            }
            else
            {
                status = run(communicator);
            }
        }

        System.exit(status);
    }

    private static int run(Ice. Communicator communicator)
    {
        //
        // First we try to connect to the object with the `hello'
        // identity.  If it's not registered with the registry, we
        // search for an object with the ::Demo::Hello type. 
        //
        HelloPrx hello = null;
        try
        {
            hello = HelloPrxHelper.checkedCast(communicator.stringToProxy("hello"));
        }
        catch(Ice. NotRegisteredException ex)
        {
            IceGrid. QueryPrx query =
                IceGrid. QueryPrxHelper.checkedCast(communicator.stringToProxy("DemoIceGrid/Query"));
            hello = HelloPrxHelper.checkedCast(query.findObjectByType("::Demo::Hello"));
        }
        if(hello == null)
        {
            System.err.println("couldn't find a `::Demo::Hello' object");
            return 1;
        }

        menu();

        java.io. BufferedReader in = new java.io. BufferedReader(new java.io. InputStreamReader(System.in));

        String line = null;
        do
        {
            try
            {
                System.out.print("==> ");
                System.out.flush();
                line = in.readLine();
                if(line == null)
                {
                    break;
                }
                if(line.equals("t"))
                {
                    hello.sayHello();
                }
                else if(line.equals("s"))
                {
                    hello.shutdown();
                }
                else if(line.equals("x"))
                {
                    // Nothing to do
                }
                else if(line.equals("?")) 
                {
                    menu();
                }
                else
                {
                    System.out.println("unknown command `" + line + "'");
                    menu();
                }
            }
            catch(java.io. IOException ex)
            {
                ex.printStackTrace();
            }
            catch(Ice. LocalException ex)
            {
                ex.printStackTrace();
            }
        }
        while(!line.equals("x"));

        return 0;
    }

    private static void menu()
    {
        System.out.println(
            "usage:\n" +
            "t: send greeting\n" +
            "s: shutdown server\n" +
            "x: exit\n" +
            "?:  help\n");
    }
}
