/*******************************************************************************
 * 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.ofbiz.base.start;

import java.util.List;
import java.util.concurrent.atomic.AtomicReference;

/**
 * OFBiz startup class.
 *
 * <p>
 * This class implements a thread-safe state machine. The design is critical
 * for reliable starting and stopping of the server.
 * </p>
 * <p>
 * The machine's current state and state changes must be encapsulated in this
 * class. Client code may query the current state, but it may not change it.
 * </p>
 * <p>
 * This class uses a singleton pattern to guarantee that only one server instance
 * is running in the VM. Client code retrieves the instance by using the 
 * <tt>getInstance()</tt> static method.
 * </p>
 */
public final class Start {

    private Config config = null;
    private final AtomicReference<ServerState> serverState = new AtomicReference<ServerState>(ServerState.STARTING);

    // Singleton, do not change
    private static final Start instance = new Start();
    private Start() {
    }

    /**
     * main is the entry point to execute high level OFBiz commands 
     * such as starting, stopping or checking the status of the server.
     * 
     * @param args: The commands for OFBiz
     */
    public static void main(String[] args) {
        List<StartupCommand> ofbizCommands = null;
        try {
            ofbizCommands = StartupCommandUtil.parseOfbizCommands(args);
        } catch (StartupException e) {
            // incorrect arguments passed to the command line
            StartupCommandUtil.highlightAndPrintErrorMessage(e.getMessage());
            StartupCommandUtil.printOfbizStartupHelp(System.err);
            System.exit(1);
        }

        CommandType commandType = determineCommandType(ofbizCommands);
        if(!commandType.equals(CommandType.HELP)) {
            instance.config = StartupControlPanel.init(ofbizCommands);
        }
        switch (commandType) {
            case HELP:
                StartupCommandUtil.printOfbizStartupHelp(System.out);
                break;
            case STATUS:
                System.out.println("Current Status : " + AdminClient.requestStatus(instance.config));
                break;
            case SHUTDOWN:
                System.out.println("Shutting down server : " + AdminClient.requestShutdown(instance.config));
                break;
            case START:
                try {
                    StartupControlPanel.start(instance.config, instance.serverState, ofbizCommands);
                } catch (StartupException e) {
                    StartupControlPanel.fullyTerminateSystem(e);
                }
                break;
        }
    }

    /**
     * Returns the <code>Start</code> instance.
     */
    public static Start getInstance() {
        return instance;
    }

    /**
     * Returns the server's main configuration.
     */
    public Config getConfig() {
        return this.config;
    }

    /**
     * Returns the server's current state.
     */
    public ServerState getCurrentState() {
        return serverState.get();
    }

    /**
     * This enum contains the possible OFBiz server states.
     */
    public enum ServerState {
        STARTING, RUNNING, STOPPING;

        @Override
        public String toString() {
            return name().charAt(0) + name().substring(1).toLowerCase();
        }
    }

    private static CommandType determineCommandType(List<StartupCommand> ofbizCommands) {
        if (ofbizCommands.stream().anyMatch(
                command -> command.getName().equals(StartupCommandUtil.StartupOption.HELP.getName()))) {
            return CommandType.HELP;
        } else if (ofbizCommands.stream().anyMatch(
                command -> command.getName().equals(StartupCommandUtil.StartupOption.STATUS.getName()))) {
            return CommandType.STATUS;
        } else if (ofbizCommands.stream().anyMatch(
                command -> command.getName().equals(StartupCommandUtil.StartupOption.SHUTDOWN.getName()))) {
            return CommandType.SHUTDOWN;
        } else {
            return CommandType.START;
        }
    }

    private enum CommandType {
        HELP, STATUS, SHUTDOWN, START
    }
}
