/*
 *  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.directory.server.tools;


import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.apache.commons.cli.AlreadySelectedException;
import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.CommandLineParser;
import org.apache.commons.cli.HelpFormatter;
import org.apache.commons.cli.MissingArgumentException;
import org.apache.commons.cli.MissingOptionException;
import org.apache.commons.cli.Option;
import org.apache.commons.cli.Options;
import org.apache.commons.cli.ParseException;
import org.apache.commons.cli.PosixParser;
import org.apache.commons.cli.UnrecognizedOptionException;


/**
 * The primary command base class.
 * 
 * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
 * @version $Rev$
 */
public class BaseCommand
{
    private Map commands = new HashMap();

    private List commandsOrdered = new ArrayList();

    private Options global = new Options();

    private String productCommand;

    private String productVersion;

    private String productDisplayName;

    private String productUrl;

    private String productBanner;


    public BaseCommand()
    {
        init();
    }


    protected void init()
    {
        ToolCommand command;

        command = new DiagnosticCommand();
        commands.put( command.getName(), command );
        commandsOrdered.add( command.getName() );

        command = new DisconnectNotificationCommand();
        commands.put( command.getName(), command );
        commandsOrdered.add( command.getName() );

        command = new DumpCommand();
        commands.put( command.getName(), command );
        commandsOrdered.add( command.getName() );

        command = new CapacityTestCommand();
        commands.put( command.getName(), command );
        commandsOrdered.add( command.getName() );

        command = new GracefulShutdownCommand();
        commands.put( command.getName(), command );
        commandsOrdered.add( command.getName() );

        command = new ImportCommand();
        commands.put( command.getName(), command );
        commandsOrdered.add( command.getName() );

        command = new IndexCommand();
        commands.put( command.getName(), command );
        commandsOrdered.add( command.getName() );

        Option op = new Option( "i", "install-path", true, "path to installation directory" );
        getGlobal().addOption( op );
        op = new Option( "b", "banner", false, "suppress banner print outs" );
        getGlobal().addOption( op );
        op = new Option( "d", "debug", false, "toggle debug mode" );
        getGlobal().addOption( op );
        op = new Option( "v", "verbose", false, "toggle verbose debugging" );
        getGlobal().addOption( op );
        op = new Option( "q", "quiet", false, "keep the noise down to a minimum" );
        getGlobal().addOption( op );
        op = new Option( "c", "configuration", false, "force loading the server.xml (requires -i)" );
        getGlobal().addOption( op );
        op = new Option( "version", false, "print the version information and exit" );
        getGlobal().addOption( op );
    }


    public static boolean hasBannerOption( String[] args )
    {
        for ( int ii = 0; ii < args.length; ii++ )
        {
            if ( args[ii].equals( "-b" ) || args[ii].equals( "-banner" ) )
            {
                return true;
            }
        }
        return false;
    }


    public CommandLine getCommandLine( String command, String[] args )
    {
        Options all = allOptions( command );
        CommandLineParser parser = new PosixParser();
        CommandLine cmdline = null;
        try
        {
            cmdline = parser.parse( all, args );
        }
        catch ( AlreadySelectedException ase )
        {
            System.err.println( "Command line parsing failed for " + command + ".  Reason: already selected "
                + ase.getMessage() );
            System.exit( 1 );
        }
        catch ( MissingArgumentException mae )
        {
            System.err.println( "Command line parsing failed for " + command + ".  Reason: missing argument "
                + mae.getMessage() );
            System.exit( 1 );
        }
        catch ( MissingOptionException moe )
        {
            System.err.println( "Command line parsing failed for " + command + ".  Reason: missing option "
                + moe.getMessage() );
            System.exit( 1 );
        }
        catch ( UnrecognizedOptionException uoe )
        {
            System.err.println( "Command line parsing failed for " + command + ".  Reason: unrecognized option"
                + uoe.getMessage() );
            System.exit( 1 );
        }
        catch ( ParseException pe )
        {
            System.err.println( "Command line parsing failed for " + command + ".  Reason: " + pe.getClass() );
            System.exit( 1 );
        }

        return cmdline;
    }


    public Options allOptions( String command )
    {
        if ( command.equals( "help" ) )
        {
            return getGlobal();
        }

        Options all = new Options();
        ToolCommand cmd = ( ToolCommand ) getCommands().get( command );

        for ( Iterator ii = getGlobal().getOptions().iterator(); ii.hasNext(); )
        {
            all.addOption( ( Option ) ii.next() );
        }

        for ( Iterator ii = cmd.getOptions().getOptions().iterator(); ii.hasNext(); )
        {
            all.addOption( ( Option ) ii.next() );
        }
        return all;
    }


    public static void dumpArgs( String msg, String[] args )
    {
        if ( args.length == 0 )
        {
            System.out.println( msg );
            System.out.println( "\t NONE" );
            return;
        }

        StringBuffer buf = new StringBuffer();
        buf.append( msg ).append( "\n" );

        for ( int ii = 0; ii < args.length; ii++ )
        {
            buf.append( "\targs[" + ii + "] = " ).append( args[ii] ).append( "\n" );
        }
        System.out.println( buf );
    }


    public void helpOnCommand( String command )
    {
        if ( command.equals( "help" ) )
        {
            printUsage();
            System.exit( 0 );
        }

        if ( getCommands().containsKey( command ) )
        {
            ToolCommand cmd = ( ToolCommand ) getCommands().get( command );
            HelpFormatter formatter = new HelpFormatter();
            formatter.printHelp( getProductCommand() + " " + cmd + " [options]", cmd.getOptions() );
        }
        else
        {
            System.err.println( command + ": unknown command" );
            System.exit( 1 );
        }
    }


    public void printUsage()
    {
        HelpFormatter formatter = new HelpFormatter();
        formatter.printHelp( getProductCommand() + " <command> [options]", "\nGlobal options:", getGlobal(),
            "\nType \"" + getProductCommand() + " help <command>\" for help on a command." );
        System.out.println( "\nAvailable commands:" );

        Iterator it = commandsOrdered.iterator();
        System.out.println( "\thelp" );

        while ( it.hasNext() )
        {
            System.out.println( "\t" + it.next() );
        }

        System.out.println( "\nThese tools are used to manage " + getProductDisplayName() + "." );
        System.out.println( "For additional information, see " + getProductUrl() );
    }

    static final String BANNER = "       _                     _          ____  ____    _____           _      \n"
        + "      / \\   _ __   __ _  ___| |__   ___|  _ \\/ ___|  |_   _|__   ___ | |___  \n"
        + "     / _ \\ | '_ \\ / _` |/ __| '_ \\ / _ \\ | | \\___ \\    | |/ _ \\ / _ \\| / __| \n"
        + "    / ___ \\| |_) | (_| | (__| | | |  __/ |_| |___) |   | | (_) | (_) | \\__ \\ \n"
        + "   /_/   \\_\\ .__/ \\__,_|\\___|_| |_|\\___|____/|____/    |_|\\___/ \\___/|_|___/ \n"
        + "           |_|                                                               \n";


    public void printBanner()
    {
        System.out.println( getProductBanner() );
    }


    public void setProductCommand( String productCommand )
    {
        this.productCommand = productCommand;
    }


    public String getProductCommand()
    {
        return productCommand;
    }


    public void setProductVersion( String productVersion )
    {
        this.productVersion = productVersion;
    }


    public String getProductVersion()
    {
        return productVersion;
    }


    public void setProductDisplayName( String productDisplayName )
    {
        this.productDisplayName = productDisplayName;
    }


    public String getProductDisplayName()
    {
        return productDisplayName;
    }


    public void setProductUrl( String productUrl )
    {
        this.productUrl = productUrl;
    }


    public String getProductUrl()
    {
        return productUrl;
    }


    public void setProductBanner( String productBanner )
    {
        this.productBanner = productBanner;
    }


    public String getProductBanner()
    {
        return productBanner;
    }


    public void setCommands( Map commands )
    {
        this.commands = commands;
    }


    public Map getCommands()
    {
        return commands;
    }


    public void setGlobal( Options global )
    {
        this.global = global;
    }


    public Options getGlobal()
    {
        return global;
    }
}
